标签:
C++语言是对C语言的扩展。所以熟悉C语言的人会发现,本书的第01~18章讲的内容基本上和C语言的内容差不多。C++一方面对C语言的语法进行了修改,另一方面又添加一些新的概念。
C++中新增的概念有:bool类型、引用(14章)、类(19~24章)、模板(25~26章)、异常(27章)。
C++相对于C有变化的语法点有:变量分散定义、函数名重载、struct语法。本章着重是比较分析这几个有变化的语法点。
本篇选自《C/C++学习指南》,附录14
权利声明:作者拥有本书的全部权利。作者授权任何人都可以自由转载本网站发布的内容,但转载时必须遵守以下限制: ①转载时必须全文转载,不得有任何修改,必须包含“权利声明”和“官网地址” ② 仅限于网络转载,即最终结果公布于网络上。凡是不遵守以上两条的转载行为视为侵权行为。除非本人允许,任何人不得将本网站内容内容用于任何的其他用途。
官网地址: http://www.afanihao.cn/ 留言请到http://www.afanihao.cn/kbase/
当文件以.c作为后缀时,编译器以C语言的语法对该文件进行编译;当文件以.cpp作为后缀时,编译器以C++的语法标准对其进行编译。所以,文件的后缀名是有这个约定的,不能够随便更改。
在添加文件时,输入文件名的后缀是.c,那在编辑这个文件时必须遵守C语言的语法,如下图所示,
这一点在第8章介绍函数略有介绍。
在C语言中,所有的局部变量必须在函数或复合语句的最前面集中定义,简单地说就是变量定义语句要放在前面。不然就报语法错误。
下面的main.c(C语言)代码中,局部变量a,b的均在函数体的前部定义,因而符合C语言的语法要求,
////////////// main.c ////////// #include <stdio.h> void main() { int a; // 变量定义 int b; // 变量定义 a = 10; printf("a=%d \n", a); b = 11; printf("b=%d \n", b); }
下面的main.c(C语言)代码中,局部变量c的定义没有放在前面,不符合C语言的语法要求,因而编译报错,
////////////// main.c ////////// #include <stdio.h> void main() { int a; // 变量定义 int b; // 变量定义 a = 10; printf("a=%d \n", a); b = 11; printf("b=%d \n", b); int c ; // 变量定义语句不能放在这里 c = a + b; printf("c=%d\n", c); }
显然,这样对于程序员来说是很不方便的。于是C++语言去掉了这个限制,让程序员可以随时随地的定义变量。
C++允许多个函数使用相同的函数,这称为函数名重载。而这在C语言中是万万不可以的,在C语言中,全局函数名是不能重复的。例如,在下面的main.c文件中,存在两个名称相同的全局函数do_something,导致编译器报错,
////////////// main.c ////////// #include <stdio.h> void do_something(int x, int y) { printf("int , int \n"); } void do_something(double x, double y) { printf("double , double \n"); } void main() { printf("test"); }
这个问题的本质是,在C语言中,以函数名来唯一区分一个全局函数。换句话说,函数名就是函数的唯一ID,显然ID这个东西是不能冲突的。
这导致了在C语言中,给函数起名字也成了一个比较麻烦的事情,对于功能类似的函数,由于不能起相同的名字,所以只好不停地加一些后缀以示区别,例如,
do_something_int_int()
do_something_double_double()
如果你将来阅读一些C语言的代码,相信会有此感受。
C++针对此问题的改进是:以函数名+参数列表来唯一区分函数。所以,在C++中函数名是允许相同的,只要参数列表有所不同就不会冲突。
在C语言中, struct类型的定义必须加上struct的前缀,
而在C++中,struct可以直接使用其类型名来定义
相比之下,应该是C++的语法更简洁一些。所以在用C语言编写代码的时候,老是要加一个struct前缀会让人觉得不耐烦,所以C程序员通常是这么来定义的struct的。在下面的代码中,使用typedef来定义一个object_t的类型,
在C语言的世界里,这么定义struct是通用模式,为的就是在使用的时候少写一个struct前缀。(可见C程序员有多么无耐)。
在需要定义链表的时候,C程序员有两种写法,
struct Object { int id; struct Object * next; // }; 或 typedef struct _tag_object { int id; struct _tag_object * next; }object_t;
实际上,C++对struct进行提全面的升级,以至于C++的struct几乎完全等效于class的语法了。凡是class支持的语法,包括成员函数、public/private、继承等所有的语法,struct也都全部支持且意义不变。也就是说,struct是class的同义语(略有差别,后面讲到)。
唯一的一点小区别:对于struct,如果没有声明任何修改符(public/protected/private),则默认所有成员是public的。这一点上class相反,class默认是private的。
标签:
原文地址:http://blog.csdn.net/iamshaofa/article/details/44303883