C++相对于C有哪些增强

       相对与c语言而言,C++的实用性有所增强

       C语言中的变量必须在作用域开始的位置定义,而c++中更强调语言的实用性,所有的变量都可以在需要使用的时候再定义

       register关键字的增强:关键字,请求编译器直接变量放在寄存器里,速度快;在C语言中寄存器里是没办法取地址的,也就是说不能在寄存器变量上取地址;而在C++中是可以在寄存器变量上取地址的

register关键字的变化

       1、register关键字请求“编译器”将局部变量存储于寄存器中,C语言无法取得register变量地址,在C++中依然支持register关键字,C++编译器有自己的优化方式,不使用register也可能做优化,在C++中可以取得register变量的地址

       2、C++编译器发现程序中需要取register变量的地址时,register对变量的声明变得无效

       3、早期C语言编译器不会对代码进行优化,因此register变量是一个很好的补充。

函数类型检测增强

       在C语言中,重复定义多个同名的全局变量是合法的;

       在C++中,不允许定义多个同名的全局变量;

       C语言中多个同名的全局变量最终会被链接到同一个地址空间上:

       int g_var;

       int g_var=1; 结果是对的

       C++直接拒绝这种二义性的做法

       int g_var;

       int g_var=1;编译后会报错

struct的增强:

       在C语言中,struct定义了一组变量的集合,编译器并不认为这是一种新的类型

       在C++中,struct是一个新类型的定义声明,并且struct可以完成与class相同的功能

       例:

#include<iostream>

using namespace std;

struct Stu

{

public:int m;

private:int n;

protected:char a[100];

};

int main()

{

        Stu Stu1;           //在C语言中这样写是错误的,C语言中这样定义 struct Stu Stu1;

        Stu1.m = 10;

        cout << Stu1.m<< endl;

        system("pause");

}

    

C++中的函数和变量都必须有类型

    这就说明,在C++ 中对类型的检查将更加严格,而C中的默认类型在C++中是不合法的;

C++新增Bool类型关键字

    C++在C语言的基础类型系统之上增加了Bool,bool类型可取的值只有true和false;理论上bool只占用一个字节,但是如果多个bool变量定义在一起,可能会各占一个bit,这取决于编译器的实现;

    true代表真值,编译器内部用1来表示;

    false代表非真值,编译器内部用0表示;

    boo类型只有true(非0)和false(0)两个值,C++编译器会在赋值时将非0值转换为false

#include<iostream>

using namespace std;

int main()

{

        bool b,b1,b2,b3;

        b = true;

        //cout <<"sizeof(b):"<<sizeof(b)<< endl;//bool所占内存空间为一个字节

        b1 = 10;

        cout <<"b1="<<b1 << endl;

        b2 = -10;

        cout << "b2="<<b2<< endl;

        b3 = 0;

        cout <<"b3="<<b3 << endl;

        system("pause");

}

三目运算符功能增强

    1、在C语言中,表达式的元素结果,放在寄存器中,表达式的返回值,是一个数;在C++里面,表达式返回的是变量本身 

    2、C++编译器是如何做到让表达式是返回的是变量本身,也就是说让表达式返回一个内存空间,即内存首地址。

#include<iostream>

using namespace std;

int main()

{

        int a = 10;

        int b = 20;

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

        cout << "a="<<a<< endl;

        cout << "b=" << b << endl;

        system("pause");

}

 在C语言中依然可以实现用表达式当左值得效果

#include<stdio.h>

int main()

{

    int a=10;

    int b=20;

    *(a<b?&a:&b)=30;

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

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

}

    3、本质:C++编译器帮我们程序员完成了以上我们要在C语言中完成的工作,即C++编译器帮我们取了一个地址而已

    需要注意的是:一旦三目运算符中可能返回的值为一个常量值,则不能作为左值使用

    

猜你喜欢

转载自blog.csdn.net/error0_dameng/article/details/81668811