C++与C的区别
来源:互联网 发布:oracle数据库中rownum 编辑:程序博客网 时间:2024/05/16 05:14
C++与C的区别
来源:IIEEG02-23-2011
1) 函数声明
l C如果不写返回值,默认是int,而C++中不能不写返回值(可用void表示无返回值)。
如Func1();
l int Func1()在C中表示可带任意参数的函数,这是C的漏洞,使得它避开了参数类型检查;而C++中表示不带参数的函数。
2) 头文件的区别
l C++的头文件去掉了C中的.h,以c前缀开始。比如, 变为
l C带.h的是非模板化的头文件,而C++是模板化的头文件。
.h文件是不含命名空间的,所以以前的是不需要using的。
当然也可以用老的C头文件,但是,在同一个程序里不能混着用,虽然编译可以通过,但是可能会出现问题。
3) register变量
在C语言中,是不能对register变量取地址的,因为它没有虚地址,在寄存器里。而C++中,它是可以取址的,这时,C++编译器会忽略register,不会把它放到寄存器里。
4) const变量
在C语言中,const是只读的变量,不是常量;C++中它是常量。
区别用例子描述如下:
const int MAX = 10;
char buffer[MAX]; //C中它是不合法的,可以用enum或
define替代;
//C++中它是合法的。
本质:C语言中const变量分配在全局静态区,默认是外部链接;C++中则在常量区,编译过程中值就定了,默认是内部链接,用extern可改为外部链接。
const int a; //在C里是合法的,在C++里必须赋初值,因为C++里是编译期间就需要它的值了,而C里是保存在内存里而不是符号表里。
5) typedef
在C语言中,
struct A
{
};
A a; //这是错误的,在C++中是合法的。
struct A a; //这是正确的
用了typedef后,C中A a;也是合法的了。
6) struct/union/class
l 对于struct/union数据成员与函数成员的访问性来说,其默认是public;
l class则是private。
l union联合体不能作为基类继承。
union A
{
};
class B: public A //编译出错
{
};
l 匿名union
union
{
int a;
float b;
};
在程序里可以直接访问 a、b。所以,如果匿名union定义为全局的,注意使得它为内部链接的,否则很容易跟外面的变量起冲突。
定义为static即可为内部链接。
关于内部链接,请参考
http://blog.csdn.net/yeming81/archive/2010/05/31/5637704.aspx
7) 小作用域
在C语言中,如下写法是会出编译错误的:
for( int i = 0; i < 10; i++)
{
}
8) C语言没有函数重载
关于C++的函数重载,请参考
http://blog.csdn.net/yeming81/archive/2010/05/31/5637736.aspx
9) 类型安全链接
在C语言中,
a.cpp
void Func1( int ) { }
b.cpp
void Func1( char );
int main()
{
Func1( 1 ); //C语言中是没有错误的,但C++不行。
}
因为C++是类型安全链接的,对于Func1来说,它是内部链接的,它看不见a.cpp中定义的函数,它调用Func1_char函数,但是找不到实现。
可见:可以利用C++编译器去编译C语言程序,找出潜在的错误。
10) C++有异常机制,而C没有。
关于异常,请参考
http://blog.csdn.net/yeming81/archive/2010/06/16/5673070.aspx
- 后缀名C与c的区别
- GNU C 与 ANSI C的区别
- C与C++的区别
- 标准C 与Keil C的区别
- GNU C 与 ANSI C的区别
- GNU C 与 ANSI C的区别
- GNU C 与 ANSI C的区别
- GNU C与ANSI C的区别
- GNU C 与 ANSI C的区别
- C-串与string的区别(C++)
- 【C/C++】指针与引用的区别
- C, C++,C#的区别与联系
- [C/C++]堆栈的概念与区别
- .C与.CPP的区别
- C与C++的区别
- C与C++的区别
- C与C++的区别
- C与C++的区别
- 解决telnet 登录错误“Failure in initializing the telnet session”
- C与C++的区别
- HeapAlloc,GlobalAlloc,LocalAlloc,VirtualAlloc
- ThinkPad 开机总提示找到新硬件 PCI Device
- Perl模块 (转)
- C++与C的区别
- 如何在远程桌面时可以远程连接声卡
- The truth of Bush hid the facts
- ubuntu 命令修改IP DNS DEF—GW
- 解决VS2008右键菜单不显示"查看代码"的方法
- Struts2拦截器(Interceptor)
- 解剖病毒变形记
- [转]HttpWebRequest使用注意(发生阻塞的解决办法)
- C++与C语言的区别