c++ const限定符

const限定符

  1. const对像一旦创建,其值就不能发生改变。const对象必须初始化

    const int i = get_size();//正确,运行时初始化。
    const int j = 1;//正确,编译时初始化。
    
    j = 2;//错误,j是一个常量,试图对其赋值行为将发生错误。
    const int err;//错误。
    
  2. 只能在const类型上执行不改变其内容的操作。

    int i = 1;
    const int ci = i;//正确,i的值拷贝给ci。
    int j = ci;//正确,ci的值拷贝给j
    
  3. 对常量的引用不能用作修改它所绑定的对象。

    const int ci = 1;
    const int &r1 = ci;//正确,引用及其对应的对象都是常量。
    
    r1 = 42;//错误,r1是对常量的引用,不能通过r1修改ci。
    int &r2 = ci;//错误,非常量引用不能指向常量对象。
    
  4. 允许为一个常量引用绑定一个非常量对象、字面值、一般表达式。

    int i = 1;
    const int &r1 = i;//正确,允许将const int&绑定到一个int对象上。
    const int &r2 = 2;//正确,r2是一个常量引用
    const int &r3 = r1*2;//正确,r3是一个常量引用
    
    int &r4 = r1*2;//错误,非常量引用不能指向常量对象。
    
  5. 对const的引用可能引用一个非const的对象,可以通过其他途径改变非const对象,但是不能通过const引用改变这个非const对象。

    int i =1;
    int &r1 = i;
    const int &r2 = i;
    r1 = 0;//正确,r1不是常量引用,i被修改为0。
    r2 = 0;//错误,r2是个常量引用,不能通过修改r2修改i对象。
    
  6. 指向常量的指针:不能用于改变其所指对象的值。只能用指向常量的指针存放常量对象的地址。

    const double pi =3.14;
    double *ptr = π//错误,普通指针不能指向常量对象
    const double *cptr = π//正确,常量指针cptr可以指向常量对象pi。
    *cptr = 1;//错误,不能通过常量指针修改其所指对象的值。
    
  7. 允许一个指向常量的指针指向一个非常量对象,指向常量的指针仅仅要求不能通过该指针改变对象的值,但没有规定那个对象的值不能通过其他途径改变。

    double k = 6.78;
    const double *pk = &k;//正确,但是不能通过pk改变k的值。
    
  8. const指针:

    指针是对象,因此允许把指针本身定义为常量,常量指针必须初始化,一旦初始化完成,他的值(存放在指针中的那个地址)就不能再改变了。不变的是指针本身的值,而非指向的那个对象的值。

    //*放在const前面,说明指针是一个常量。
    int i = 0;
    int *const val = &i;//val将一直指向i。
    const double pi = 3.14;
    const double *const pip = π//pip是一个指向常量对象的常量指针。
    
    
  9. 顶层const和底层const。

    指针本身是一个对象,它又可以指向另一个对象。

    顶层const(top-level const)表示指针本身是个常量。

    底层const(low-level const)表示指针所指对象是一个常量。

    更一般来说,顶层const表示任意的对象是常量。底层const则与指针和引用等复合类型的基本类型部分有关。

    int i = 0;
    int *const p1 = &i;//不能改变p1的值,顶层const
    const int ci = 42;//不能改变ci的值,顶层const
    const int *p2 = &ci;//允许改变p2的值,底层const
    
    
发布了218 篇原创文章 · 获赞 131 · 访问量 13万+

猜你喜欢

转载自blog.csdn.net/qq_40828914/article/details/104206835