如果要说C和C++的区别的话,可能可以列出很多方面出来,但是有许多方面的区别是我们学完这两门语言之后就可以
很好的理解和区分的,比如C是面向过程的一门编程语言,C++虽然主要是以C的基础发展起来的一门新语言,但它不是
C的替代品,不是C的升级,C++和C是兄弟关系,它可以很好地进行面向对象的程序设计。我要讨论的不是这些比较显
而易见的区别,而是哪些容易被我们所忽略或者混淆的区别。
区别一:重载问题
我用的比较多的IDE是VC6.0,编写代码时通常就是建立“Win32 Console Application”,现在向工程中添加test.cpp,
在test.cpp中编写代码,代码如下:
1 #include <stdio.h> 2 3 int Add(int a,int b) 4 { 5 return a+b; 6 } 7 int Add(int a,int b,int c) 8 { 9 return a+b+c; 10 } 11 12 void main() 13 { 14 Add(1,2); 15 Add(1,2,3); 16 return; 17 }
程序编译通过,并且能够正常运行。这说明C++程序可以实现重载,重载的条件是:
a.函数名相同,参数的个数不同;
b.函数名相同,参数的个数相同但参数类型不同。
而在test.c中编写同样的代码,编译时就会出现如下的错误提示:
所以可以看出C语言是不支持重载,而C++支持重载。
区别二:C/C++的void参数
在C程序中如果在声明函数的时候如果没有任何参数那么需要将参数定义为void以此来限定此函数不可传递任何参数,如果不进行限定让参数表默认为空其意义是可以传递任何参数,这个问题的由来实际上是由于要兼容早期的K&C标准造成的。K&C 在声明函数时参数表为空,也就是说函数声明时的函数原型签名信息不包含参数信息,如果要有明确的定义空参数的行为那么就要自己去处理它。
我在test01.c中编写c代码,代码如下:
1 #include <stdio.h> 2 #include <conio.h> 3
3 void SayHello() //是一个可变参数的函数
5 { 6 printf("\nHello World !"); 7 return; 8 } 9 10 void main() 11 { 12 SayHello(1); 13 SayHello(1,2,3); 14 SayHello('a','b'); 15 16 getch(); 17 return; 18 }
代码编译通过,并且正常运行。可见C语言中的函数定义时不带参数并不代表该函数在调用时不能传参,而是这个函数
将成为一个可变参的函数,调用时可以传递不同个数的参数。如果要限制这个函数不能传参,这需在定义时加void关键字,
void SayHello(void)。
再在test02.cpp中编写代码,代码与上面的代码完全相同,但是在编译的时候发生了错误:
可见在C++语言中,不带参数的函数在调用时并不是和C语言一样可以传递不同个数的参数,函数不能传递任何参数,
此时C++中的 void SayHello()或者void SayHello(void)和C中的void SayHello(void)是一样的。
参考资料:http://www.cnblogs.com/thinkingfor/archive/2010/09/14/1825842.html
区别三:struct的功能
我们都知道在C和C++代码中都可以定义结构体struct,然而C语言只能在struct中声明变量(像int类型,char类型),
但是C++语言不仅可在struct中声明变量,同时还可以定义函数,优点类似于类的既可以有成员变量又有方法。
我在test_struct.cpp中编写的代码如下:
1 #include <stdio.h> 2 #include <conio.h> 3 4 struct People 5 { 6 char *Name; //变量 7 int Age; 8 9 void SayHello(char *name,int age) //函数体 10 { 11 Name=name; 12 Age=age; 13 printf("\n My name is %s,I am %d years old .",name,age); 14 return; 15 } 16 }; 17 18 void main() 19 { 20 People p1; 21 p1.SayHello("Mike",18); 22 23 getch(); 24 return; 25 }
程序编译通过,并且成功运行,运行结果:
如果在.c文件中添加以上代码,则在编译的时候就提示出错:“函数不能作为结构体struct的成员”
所以可以说C++在struct的使用上是对C做了扩展的了。
附录:如果有重要的区别没有给出,希望大家能够提出,我可以继续完善。