C与C++之间的区别总结

来源:互联网 发布:ip与mac绑定防蹭网 编辑:程序博客网 时间:2024/05/01 00:42

(本文总结自《c++编程原理规范与实践》)

C不支持的C++的特性:

1、类和成员函数使用struct和全局函数

2、派生类和虚函数   使用struct、全局函数和指针

3、模板和內联函数使用宏

4、异常使用错误代码、错误返回值等

5、函数重载不同函数使用不同的名字

6、new和delete使用malloc()和free()

7、引用使用指针

8、常量表达式中const使用宏

9、bool类型使用int

10、static_cast,reintepret_cast,const_cast使用C传统的类型转换

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

在C函数中:

1函数不可重命名;2函数参数类型检查是可选的,不强制;

3没有引用类型(因而参数传递也没有传引用方式);

4没有成员函数;5没有內联函数(C99标准除外);

6没有可选的函数定义语法

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

虚函数最有效的替代技术之一就是函数指针:

typedef void ( *Pfct0 )( struct Shape2* );

typedef void ( *Pfct1int )( struct Shape2*,int );

 

struct Shape2

{

   Pfct0 draw;

   Pfct1int rotate;

   /*...*/

};

void draw( struct Shape2* p )

   {

       ( p->draw )( p );

   }

void rotate( struct Shape2* p,int d )

   {

       ( p->rotate )( p,d );

 

   }

只是保存一个指向函数指针数组的指针即可。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~```

在C++中,未初始化的声明被视为一个定义,但在C中,仍被视为一个声明,因此可以重复多次:

int x;

int x;   //in c is ok; in c++ is wrong

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~`

在c中,我们可以将void*赋予任何指针类型的变量,或用它来初始化指针变量,但在C++中是不可以的,必须进行显式 的转化;

例如:

void * alloc(size_t x);

void f(int n)

{

 int *p=alloc(n*sizeof(int));    //ok in C;error in c++

 //...

}

在C++中必须这样写:

int *p=(int *) alloc(n*sizeof(int));

因为这样做事不安全的。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

小的语言差异:

 

结构标签名字空间:

在C(没有类的定义)中,struct的名字与其他标识符位于不同的名字空间。因此,每个struct的名字前面都要加上关键字struct为前缀(struct称为结构标签,struct tag);

在c++中就不用添加struct关键字。

 

与此类似的还有enmu;

在c中,我们可以将一个int值赋予一个enum变量,而无需类型转换。并且可以对枚举变量进行++/--运算,而在C++中是不允许的。

enum color{red,blue,green};

int x=green;           //ok in c and c++

enum color col=7 ;    //ok in c;error in c++

enum color col=(color) 7;  //ok in c++

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~`

C风格的字符串:

 

在C中,字符串就是一个以0结尾的字符数组,在c++中,通常称为 c字符串 或 c风格字符串。

 

char* p="asdf";

p[2]='x';

这两句在c中是正确的,但是在c++中是错误的,在c++中一个字符串文字常量被视为常量,不可以被修改;我们因该这样定义:

const char * p="adsdf";

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

字节操作:

 

在c++中不要使用memset(),memcpy(),momcmp(),memset();他们会干扰构造函数的正常工作。

 

 

原创粉丝点击