C++对C语言哪些功能进行了加强?

概述:

       C++是在C语言的基础上发展而来,但他们两并不是竞争关系。C++继承了C语言的很多特性,同时也对某些特性进行了加强,以下进行逐一讲解。

 

  1. 变量检测更加严格

在C语言中重复定义多个同名全局变量,编译器可以正常编译,属于合法行为,最终会被连接到全局数据区的同一个地址上。如:

int g_var;

int g_var=0;

C编译器对以上代码不会报错。

而在C++中编译器是不会语言同名重复的变量,直接避免了这种二义性的产生。

 

  1. register

register的意思是告诉编译器直接把register修饰的局部变量放到寄存器中,好处是提高速度。

运行代码:

int main(){

register int var = 0;

Printf(“&var:”, &var);

return 0;

}

在C编译器中你会发现以上代码编译出错,并指出register修饰的变量不能取地址。但如果在C++编译中编译,则可以正常编译通道,打印对应地址。说明C++对该修饰符进行了优化。

 

  1. const

用const修饰的变量代表只读,const修饰的位置不同产品不同的功能,如:

Const int a; //值不可变

int const b;   // 同上

const int *c;  // 值不可变

int* const d;  // 对应的地址不可变

const int* const e;  // 值和地址都不可变

有以上认识之后,开始思考以下代码:

int main(){

        const int var=0;

        int* p=(int *)&var;

        *p = 10;

        prinf(“var=%d, *p=%d\n”, var, *p);

}

C编译器:

        运行结果是var=10,*p=10;证明const修饰的var也可以间接进行修改,可见在C中const修饰的变量并没有真正实现const功能,只是防止直接修改,但无法防止间接修改,可以说在C中const是一个“假的const”。

C++编译器:

        同样可以编译通道,但是运行结果是var=0,*p=10;可见在C++中const修改的变量防止了间接修改的漏洞。那它是怎么实现的呢?可能是C++在定义const变量时,如a=0,编译器给a分配了地址,在符号表里存放常量值0,*p只是修改地址上的值,并没有改变符号表里的常量0;

 

  1. struct

C编译器并不认为struct定义的结构是一种新的类型,只是认为是一组变量的集合,而在C++中struct被定义为一种新的类型,同时可实现类的大部分功能。

 

  1. 对函数和变量检测加强

func_a(i){

        printf(“i=%d\n”, i);

}

func_b(){

        return 0;

}

int main(){

        func_a(100);

        func_b(1,2,3,4);

        return 0;

}

以上代码很怪,要么没有形参类型,要么直接没有形参,同时也没有返回类型。可是在C编译器编译你会发现可以正确编译成功。但在C++编译器中就会编译失败,证明C++编译器对以上情况的检测进行了加强。

 

  1. 三目运算符

int main(){

     int a = 5;

     int b = 10;

           (a < b ? a : b )= 20;

     printf("a = %d, b = %d\n", a, b);

     system("pause");

     return 0;

}

相信做C开发的人看到以上代码就会知道有什么结果出现;没错,在C编译器中编译以上代码会报错,因为在C中三目运算符返回的是编译对应的值,而常量值是不能当左值使用的。

        但同样的代码放到C++编译器上编译,则可以成功编译,并可以正确运行,因为在C++编译器中三目运算符返回的是值的地址,因此可以当左值使用。

思考:

        在C中怎么才可能实现C++的效果呢?

        答案是:*(a < b ? &a : &b) = 20

 

以上是对C++在C的基础增强功能的总结,但不限于以上提到内容。大家可以自行挖掘。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值