Loading

2-4 C++ const限定词

建议直接看总结和比较,如有需要再看2.4.1—2.4.3了解细节

2.4.1 const之于基本类型(base type)

含义

const int i = 43为例

  • i的值不可修改

  • 因此在定义i必须初始化

  • 任何试图修改i的操作都会报错

const int i = get_size();  //ok
const int j = 42;  //ok
const int k;  //error:未初始化
j = 2; //error:试图修改j的值

编译过程

const int i = 43为例

  • 编译时,编译器会把i全部替换为43
  • 多文件编译时,如果i要在多文件中共用
    • 注意点:const修饰符修饰指针本身

    • 在定义i文件时也要externextern const int i = 43;

    • 注:一般文件在多文件共用时只需要在声明时extern

2.4.2 const之于引用

含义

  • const int &r1 = i指我们无法通过引用r1来改变它所捆绑的对象i的值
  • const引用必须初始化【只要是引用都必须如此】

作用

  • const对象必须用const引用来绑定,但const引用不一定指向const对象

  • const引用可以绑定类型不完全匹配的对象

    • image-20220110221020693

    • #include<iostream>
      using namespace std;
      int main(){
          coint i = 3;
          double pi = 3.14;  //pi加上const也可以
          const int &r1 = i; //对应类型的plain对象
          const int &r2 = pi; //自动类型转换的对象
          const int &r3 = 3.14; //自动类型转换的字面量
          //输出为“3 3 3”
          cout<<r1<<" "<<r2<<" "<<r3<<endl;
          return 0;
      }
      
  • 注:在const引用绑定自动转换对象时,编译器其实生成了一个临时变量

    double pi = 3.14;
    const int &r2 = pi;
    
    //上述代码 在编译时发生了如下过程
    const int tmp = pi; //编译器生成了一个临时const变量并进行了类型转换
    const int &r2 = tmp;  //把临时const变量和r2绑定
    

注意点

  • const引用绑定的不一定是const对象

    • 我们无法通过const引用来改变它所绑定的对象
    • 不代表它所绑定的对象本身无法改变
  • 注意必须初始化

2.4.3 const之于指针

含义【两类】

  • const 修饰指针指向的对象const int *p:无法通过指针修改指向对象

    • const 对象必须用const指针指向,但const指针不一定指向const对象
    • 定义时必须初始化
    #include<iostream>
    using namespace std;
    int main(){
        double pi = 3.14;
        const double *p = &pi;
        *p = 2.2;  //error:无法通过p修改pi
        pi = 2.2;  //pi本身可以修改
        //输出“2.2 2.2”
        cout<<pi<<" "<<*p<<endl;
        return 0;
    }
    
  • const 修饰指针对象本身 int * const p:无法修改指针的指向对象

    #include<iostream>
    using namespace std;
    int main(){
        double pi = 3.14;
        double f = 2.2;
        double *const p = &pi;
        p = &f; //error:无法修改p的指向对象
        return 0;
    }
    

变量定义的读法:从左往右

const double *const pip = &pi;

  • const pip : pip是一个const变量,它的值无法改变
  • *const pip* : pip是一个指针,指针的值无法改变,即指针指向的对象无法改变
  • const double *const pip : pip指向的对象的类型是pip【含义是无法通过pip改变对象的值】

如何理解最后一行?

image-20220110223056814

const之于三种类型的总结比较

明确各个const的含义

代码 const的含义 必须初始化
const int i = 1 无法改变i的值
const int &r = i 无法通过r改变i的值
const int *p = &i 无法通过p改变i的值
int *const p 无法改变p指向的对象
  • t 对象要建立引用必须用const 引用,建立指针必须用const int *p`
  • const 引用可以绑定不完全匹配的对象和常量

2.4.3 顶层const(Top-Level const)

含义

  • 顶层const(Top-Level const):对象本身是const【值不可变】,可修饰所有数据类型
    • const int i = 1
    • int *const p【指针的值不可变就等价于指针所指的对象不可变】
  • 底层const(Low-Level const):修饰引用和指针类型所绑定的对象类型 , 无法通过引用或指针改变绑定对象的值
    • const int &r = i
    • const int *p = &i

拷贝操作

image-20220110224754974

image-20220110224812656

  • 顶层const不影响拷贝操作

    image-20220110224850993

  • 底层const对拷贝操作有限制

    • 两边必须有底层const,右值的非const可以转化为const

      image-20220110225628367

    • 两边类型相同时例外,一个const变量显然可以拷贝给一个同类型的非const变量

      • const int i = 1; int j = i;这样的拷贝显然是成立的
posted @ 2022-01-11 21:32  咪啪魔女  阅读(39)  评论(0编辑  收藏  举报