顶层const与底层const

Reference

《C++ Primer》P58:当执行对象拷贝操作时,常量的顶层const不受什么影响,而底层const必须一致

  const int a = 10;
  int b = a;  // 拷贝a的值,顶层const加不加不受影响
  const int *const p = new int(10);
  // int *p1 = p;        // error 底层const必须一致
  // int *const p2 = p;  // error 错误同上
  const int *p3 = p;  // 顶层const可以忽略,但底层必须一致加上了第一个const
  // int *p4 = &a;  // error a虽然是顶层const,&a变成了底层const 注意!!!
  const int *p4 = &a;
  const int &r1 = a;  //常量引用如果在左侧,右侧可以接任何东西
  const int &rr1 = b;  //常量引用如果在左侧,右侧可以接任何东西
  const int &rr2 = 40;  //常量引用如果在左侧,右侧可以接任何东西
  // int &r2 = a;          // error 非常量引用 = 常量
  // int &r3 = r1;  // 引用如果在等号右侧,请忽略& ,错误同上
  int c = a;  // 等于int c = a; 非常量 = 常量引用

对于 const int *const p = new int(10); 第一个const为底层const,第二个const为顶层const

(const) p ---> 10(const) , 若pa--->10(const) 显然,如果语句编译通过那*pa=11就可以执行,pa可以直接修改这个10,这是不对的,int *pa = p是错误的

而对于 int *const p = new int(10);来说,(const) p ---> 10,那么pa--->10是可以的,于是 int *pa = p是可以通过的

Note

关于引用&总结如下几点:

  • 引用不是对象且不进行拷贝,不满足上面的原则
  • 常量引用如果在左侧,右侧可以接任何东西
  • 非常量引用 = 常量 (报错!!!)
  • 引用如果在等号右侧,请忽略&
  • 非常量 = 常量引用 (正确)
-->