C与C++之间的区别总结
2011-03-28 23:40
211 查看
(本文总结自《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();他们会干扰构造函数的正常工作。
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();他们会干扰构造函数的正常工作。
相关文章推荐
- C++ 字符类型总结&CString ,BSTR ,LPCTSTR之间关系和区别
- C++ 字符类型总结&CString ,BSTR ,LPCTSTR之间关系和区别
- 总结一下C++与C#之间的区别
- 简单来总结一下C++与C#之间的区别
- C++ 模板和 C# 泛型之间的区别
- select、poll、epoll之间的区别总结[整理]
- Jenkins学习总结(4)——持续集成,持续交付,持续部署之间的区别
- select、poll、epoll之间的区别总结[整理]
- select、poll、epoll之间的区别总结[整理]
- c++中关于类(class)和结构体(struct)的区别个人总结
- select、poll、epoll之间的区别总结[整理]
- C++学习,总结二(模拟鼠标键盘操作和进程之间的通信)
- c++ 字符类型总结区别wchar_t,char,WCHAR(转)
- Objective-C、C++以及C之间的区别
- c++ 和c#之间的区别
- select、poll、epoll之间的区别总结[整理]
- select、poll、epoll之间的区别总结
- C/C++程序中内存的分配和堆栈的区别总结
- select、poll、epoll之间的区别总结
- Objective-C、C++以及C之间的区别