• C++比起C来新增的拓展


    • 命名空间
    • register
    在C语言横行的时代,为了加快运行速度,一些关键变量会被放入寄存器中,程序代码请求编译器把变量存入寄存器,然而C语言版的寄存器变量无法通过地址获得register变量。
    c++仍然支持关键字register
    #include "iostream"
    #include<string>
    using namespace std;
    void main()
    {
        for (int i = 0; i < 10000; i++)
        {
            printf("%d
    ", i);//这种情况下就会把i放入寄存器,因为i被频繁使用
        }
        system("pause");
    }
    #include "iostream"
    #include<string>
    using namespace std;
    void main()
    {
      register string a = "陈培昌";
      printf("变量地址为%d
    ", &a);
      system("pause");
    }

    输出结果:

    •  变量检测的增强
    #include "iostream"
    #include<string>
    using namespace std;
    void main()
    {
        string a;
        string a = "陈培昌";
        printf("教练姓名%s
    ", a);
        system("pause");
    }

    所谓变量检测的增强就是c++不允许重复声明变量,而C可以(不过windows下vs2013报错,因为c/c++一直在避免这种二义性)

    • struct增强

    C语言中,struct结构是一组变量的集合,不认为它是一种新的类型,说的通俗点

    #include<stdio.h>
    struct mycoach
    {
        char name[100];
        int age;
    };
    
    void main()
    {
        struct mycoach cpc;//不加struct关键字报错
    }

    C++中

    struct mycoach
    {
        string name;
        int age;
    };
    void main()
    {
        mycoach cpc;//居然可以
        system("pause");
    }

    一些情况下,struct跟类有异曲同工之妙

    #include "iostream"
    #include<string>
    using namespace std;
    struct mycoach
    {
    public:
        string name;
        int age;
    private:
        string favorite;
    };
    void main()
    {
        mycoach cpc;
        system("pause");
    }
    • c++对数据类型的检查更严格(无论变量还是函数都需声明数据类型)
    • 新增了数据类型bool
    #include "iostream"
    #include<string>
    using namespace std;
    
    void main()
    {
        bool w=true;
        printf("布尔变量长度%d
    ", sizeof(w));
        w = -9;
        printf("布尔值为%d
    ", w);
        w = 8;
        printf("布尔值为%d
    ", w);
        w = 0;
        printf("布尔值为%d
    ", w);
        system("pause");
    }

    如果多个布尔值同时声明,可能占用一个bit,取决于编译器的实现

    bool b2,b3,b4;

    • 三目运算符的增强
    C语言中,表达式的返回值放到了CPU寄存器里面,是一个值(数),而c++返回的是变量的本身

    c++

    void main()
    {
        int a = 20;
        int b = 10;
        (a < b ? a : b) = 30;//相当于执行b=30;
        printf("值b为:%d
    ", b);
        system("pause");
    }

    然而c语言中

     究其原因是C语言返回了b的值,所以(a<b?a:b)=30最后执行的命令是10=30;这样一来操作就变得毫无意义;据说这个例子是说明C和c++编译器不同的有力案例

    c++如何做到的?看来是返回了地址......,所以c语言的代码不妨修改如下:

    #include<stdio.h>
    
    void main()
    {
        int a = 20;
        int b = 10;
        *(a < b?&a :&b) = 30;
        printf("值b为:%d
    ", b);
        system("pause");
    }

    输出结果:

    •  const用法
    #include<iostream>
    using namespace std;
    struct mycoach
    {
        string name;
        int age;
    };
    
    int opcoach01(mycoach* const pt)
    {
        //指针变量本身不能被修改
        pt->name = "陈培昌";
        pt = NULL;
    }
    
    int opcoach02(const mycoach *pt)
    {
        //指针指向的内存空间不能被修改
        pt->name = "陈培昌";
    }

    输出结果:

     

     

    #include<stdio.h>
    
    void main()
    {
        const int a = 20;
        a = 30;
        printf("值a为:%d
    ", a);
        system("pause");
    }

    输出结果:

    然而:

    #include<stdio.h>
    
    void main()
    {
        const int a = 20;
        int *p = NULL;
        p =&a;
        *p = 30;
        printf("值a为:%d
    ", a);
        getchar();
    }

    这样一来:

     因此在c语言中const是个伪常量;而c++无法这样修改,因为c++编译器扫描到const类型时,并不像c语言那样为其分配内存,而是放入符号表(一种键值对类型的数据结构)

    有别于C语言内存四区

    c++编译器扫描到对常量取地址操作时,为常量分配内存空间
    或者const变量作为一种全局变量使用时,也会分配内存空间

    c++ const类型实现机制

     取值时,从符号表里读取a对应的变量

    执行 p=int(*)&a操作时,另开辟了一块空间,让整型指针p指向这块空间的地址

    下列代码证实p指向的空间存在

    #include<iostream>
    using namespace std;
    void main()
    {
        const int a = 30;
        int *p = NULL;
        p = (int*)&a;
        *p = 40;
        printf("a的值依旧是:%d
    ",a);
        cout << "p指向的空间真实存在,其内存地址是" << p << "值是:" << *p<<endl;
        system("pause");
    }

    输出结果:

  • 相关阅读:
    补题报告 个人赛2020.4.12
    UCF Local Programming Contest 2017 2020.4.7
    比赛:ICPC Asia Taipei-Hsinchu Regional 2019 2020.4.1
    UCF Local Programming Contest 2016 2020.3.28
    Benelux Algorithm Programming Contest 2019 2020/3/21
    比赛名:Preliminaries for Benelux Algorithm Programming Contest 2019 时间2020.3.14
    【Scala】Scala使用scalikejdbc工具连接MySQL(推荐)
    【Scala】Scala使用JDBC连接Mysql/权限问题
    【异常】Specified key was too long;max key length is 767 bytes、解决由于HDFS格式化造成Hive数据全部丢失的问题
    【异常】Hive作业异常kill :Hadoop MapReduce Error
  • 原文地址:https://www.cnblogs.com/saintdingspage/p/11936534.html
Copyright © 2020-2023  润新知