c++primer笔记--2.4const限定符

1 const对象一旦创建后其值就不能再改变,所以const对象必须初始化。
2 默认状态下,const对象仅在文件内有效。
3 编译器将在编译过程中把用到const变量的地方都替换成对应的值。(有点像宏定义)
4 可以把引用绑定到const对象上,我们称之为对常量的引用。
5 const int ci = 1024;
  const int &r1 = ci;    // 正确,与对象类型严格匹配
  int &r2 = ci;          // 错误,类型不匹配

  int i = 42;
  const int &r1 = i; // 正确,虽然类型不匹配,但是允许常量引用绑定到非常量对象上
  const int &r2 = 42;// 正确,允许常量引用绑定到字面值上
  const int &r3 = r1 * 2; // 正确,允许常量引用绑定一个表达式
6 引用的类型必须与其所引用对象的类型一致,但是有两个例外。第一种例外情况就是在初始化常量引用时允许任意表达式作为初始值,只要该表达式的结果能转换成引用的类型即可。允许为一个常量引用绑定非常量的对象,字面值,甚至是个一般表达式。
7 所谓临时量对象就是当编译器需要一个空间来暂存表达式的求值结果时临时创建的一个未命名的对象
8 常量引用仅对引用可参与的操作做出了限定,对于引用的对象本身是不是一个常量未作限定。
9 指向常量的指针不能用于改变其所指对象的值。要想存放常量对象的地址,只能使用指向常量的指针
10 指针的类型必须与其所指对象的类型一致,但是有两个例外。第一种例外情况就是允许一个指向常量的指针指向一个非常量对象。
11 指针是对象,允许把指针本身定为常量即常量指针。常量指针必须初始化,一旦初始化它的值(存放的地址)就不能再改变了。
    int a = 0;
    int *const p = &a; // 常量指针
12 指针本身是不是常量以及指针所指的是不是一个常量就是两个相互独立的问题。
13 用名词 顶层const 表示指针本身是个常量,用名词 底层const 表示指针所指的对象是一个常量
    int i = 0;
    int *const p1 = &i; // 不能改变p1的值, 顶层const
    const int ci = 42;  // 不能改变ci的值, 顶层const
    const int *p2 = &ci;// 可以改变p2的值, 底层const
    const int &r = ci;  // 底层const,引用本身就包含一个顶层const,不能更改绑定对象
14 常量表达式是指值不会改变并且在编译过程就能得到计算结果的表达式。
15 一个对象(或表达式)是不是常量表达式由它的数据类型和初始值共同决定。
16 将变量声明为constexpr类型以便由编译器来验证变量的值是否是一个常量表达式。声明为constexpr的变量一定是一个常量,而且必须用常量表达式初始化。
17 一般来说,如果你认定变量是一个常量表达式,那就把它声明成constexpr类型。
18 函数体内定义的变量一般来说并非存放在固定地址中,因此constexpr指针不能指向这样的变量。相反的,定义于所有函数体之外的对象其地址固定不变,能用来初始化constexpr指针。
19 在constexpr声明中如果定义了一个指针,限定符constexpr仅对指针有效,与指针所指的对象无关
20 constexpr把它所定义的对象置为了顶层const
    const int *p = nullptr;     // p是一个指向整型常量的指针
    constexpr int *q = nullptr; // q是一个指向整数的常量指针
    constexpr const int *p = &i; // p是常量指针,指向整型常量i

你可能感兴趣的:(读书笔记)