C与C++的差异

c语言是结构化模块化的语言,是面向过程的程序设计。c++既可以面向过程,也可以面向对象的程序设计(增加了面向对象机制)。c语言的头文件都有.h后缀名,c++中用户自己编制的头文件带.h,系统提供的头文件无后缀名,c++兼容c的头文件。c语言的结构体struct只能包含数据成员,c++的类可以包含数据成员和成员函数。c++中使用usingnamespace作为命名空间,当含有系统头文件时必须包含命名空间。

相对于c语言,c++语言增加的主要特性包括类、重载、派生、虚函数、模板以及异常处理。 但在进一步讨论这些新特性之前,我们需要讨论这两种语言之间的一些小差异。

一、注释

c++语言支持单行注释。单行注释由//开始,在之后的第一个换行符处结束。单行注释比c语言的注释更安全,因为他们不会意外丢掉注释结束的标记,但c语言的注释在c++中任然是合法的。

二、标记与类型名

在c++语言中用于标识特定的结构、联合或枚举的名字会自动被认为是类型名。因此我们将

typedef struct {double re, im;} complex;

简单写成

struct complex  {double re, im;} ;

三、不带参数的函数

在声明和定义一个不带参数的c++函数时,可以不使用void:

void draw(void); //no arguments
void draw();        //no arguments either

四、默认实际参数
c++语言允许函数的实际参数有默认值。例如,下面的函数可以显示任意个数的换行符。如果调用时没有提供任何实际参数函数会显示一个换行符。

void new_line(int n=1)
{
    while (n-- > 0)
        putchar('\n');
}

调用new_line函数时,可以提供一个实际参数,也可以不提供实际参数。

new_line(3);  //print 3 blank lines
new_line();    //print 1 blank line by default

五、引用参数

c语言规定实际参数是按值传递的,这使编写那些需要修改作为实际参数提供的变量(除了数组)都非常困难。为了回避这个限制,我们只能传递指向该变量的指针。对于一个将两个变量的内容交换的函数,其C语言的实现大致如下:

void swap(int *a, int *b)
{
    int temp;
    temp = *a;
    *a = *b;
    *b = temp;
}

当swap函数被调用时,其参数应该是指向变量的指针:

swap(&i, &j);

虽然这种方式可以正常工作,但它使用起来并不方便,代码也不易理解,还容易出错。c++语言在这方面做一些改进,允许实际参数被声明成引用,而不是指针。下面是将a和b声明为引用后swap函数的样子:

void swap(int &a, int &b)
{
    int temp;
    temp = a;
    a = b;
    b = temp;
}

当swap函数被调用时,不需要在实际参数前加&运算符:

swap(i, j);

在swap的函数体中,a和b被分别理解为i和j的别名。语句temp=a确实会将i的值复制到temp中。语句a=b也确实将j的值复制到i中。同样,b=temp将temp的值复制给j。

当看到&a这样的形式时,怎样区别是声明引用变量还是取地址的操作呢?
请记住,当及a的前面有类型符时(如int &a),它必然是对引用的声明;如果前面没有类型符(如p= &a),此时的&是取地址运算符。

六、动态存储分配

c程序可以使用函数malloc、calloc、realloc动态分配和释放内存。虽然c++程序仍然可以使用这些函数,但更好的做法是使用new和delete。 new和delete是运算符,不是函数。new用来分配空间,delete用来释放分配的空间。new的操作数是一个类型说明符:

int *int_ptr , *int_array;
int_ptr = new int;
int_array = new int[10];

当无法分配所要求的内存时,new会返回空指针。delete需要用一个指针作为他的操作数:

delete int_ptr;
delete [ ] int_array;

七、输入输出

相比于c,c++增加了自己的输入输出流cin和cout(endl作为换行机制可以使用\n替换)。c中的scanf和printf为函数,而cin和cout为对象。cout不需要对输出数据进行格式控制,系统会自动按照数据类型输出;cin有一些格式控制功能。

八、函数的重载

c语言中,在同一作用域不能包含同名函数;c++中可以,这些同名函数中参数的个数或类型必须不同,返回值类型可以相同可以不同。(函数重载)

九、函数模板

函数的重载只是形参的类型或个数不同,也要分别定义。对此能否再简化呢?为了解决这个问题,C++提供了函数模板(function template)。所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型来代表。这个通用函数就称为函数模板。凡是函数体相同的函数都可以用这个模板来代替,不必定义多个函数,只须在模板中定义一次即可。在调用函数时系统会根据实参的类型来取代模板中的虚拟类型,从而实现了不同函数的功能。模板类声明如下:

template<class T>

类型参数可以不只一个,可根据需要确定个数。如template<class T1,typename T2>

T max(T a,T b,T c)   //定义一个通用函数,用T作虚拟的类型名
{
    if(b>a)a=b;
    if(c>a)a=c;
    return a;
}

十、总结

综上所述,c++对c功能的扩展包括:
(1)允许使用以“//”开头的注释。
(2)对变量的定义可以出现在程序中的任何行(但必须在引用该变量之前)。
(3)提供了标准输入输出流cin和cout,它们不用指定输入输出格式符(如%d),使输入输出更加方便。
(4)可以用const定义常变量。
(5)可以利用函数重载实现用同一函数名代表功能类似的函数,以方便使用,提高可读性。
(6)可以利用函数模板,简化同一类型的函数的编程工作。
(7)可以使用带默认值的参数的函数,使函数的调用更加灵活。
(8)提供变量的引用类型,即为变量提供一个别名,将“引用”作为函数形参,可以实现通过函数的调用来改变实参变量的值。
(9)增加了内置函数(内嵌函数),以提高程序的执行效率。
(10)增加了单目的作用域运算符::,这样在局部变量作用域内也能引用全局变量。
(11)可以用string类定义字符串变量,使得对字符串的运算更加方便。
(12)用new和delete运算符代替malloc和free函数,使分配动态空间更加方便。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,158评论 4 370
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,600评论 1 307
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 111,785评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,655评论 0 220
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,075评论 3 295
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,002评论 1 225
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,146评论 2 318
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,918评论 0 211
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,671评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,838评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,318评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,636评论 3 263
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,343评论 3 244
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,187评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,982评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,126评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,934评论 2 279

推荐阅读更多精彩内容