差别
这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录 前一修订版 后一修订版 | 前一修订版上一修订版两侧同时换到之后的修订记录 | ||
blog:cpp:basic_const [2022/04/17 22:44] – caodan | blog:cpp:basic_const [2022/04/23 22:34] – [constexpr 和常量表达式] caodan | ||
---|---|---|---|
行 5: | 行 5: | ||
把引用绑定到const对象上,称之为对常量的引用,不能通过对常量的引用修改它所绑定的对象。 | 把引用绑定到const对象上,称之为对常量的引用,不能通过对常量的引用修改它所绑定的对象。 | ||
- | 引用的类型必须与其所引用的对象的类型一致,但是有两个例外。 | + | 引用的类型必须与其所引用的对象的类型一致,但是对于const的引用有如下例外。 |
在初始化常量引用表达式时允许用任意表达式作为初始值,只要该表达式的结果能转换为引用的类型即可。 | 在初始化常量引用表达式时允许用任意表达式作为初始值,只要该表达式的结果能转换为引用的类型即可。 | ||
行 37: | 行 37: | ||
不能定义 `int &ri = dval;`, 因为非常量引用意味着可以改变dval的值,由于类型不同,所以这种行为是非法的。 | 不能定义 `int &ri = dval;`, 因为非常量引用意味着可以改变dval的值,由于类型不同,所以这种行为是非法的。 | ||
+ | |||
+ | ## const指针 | ||
+ | |||
+ | 允许把指针本身定义为常量。常量指针必须初始化,一旦初始化完成,则它的则就不能再改变了。 | ||
+ | |||
+ | 把 `*` 放在const关键字之前用以说明指针是一个常量。(不变的是指针本身的值,而并非指向的那个值) | ||
+ | |||
+ | 例: | ||
+ | ``` | ||
+ | int errNumb = 0; | ||
+ | int *const curErr = & | ||
+ | const double pi = 3.14159; | ||
+ | const double *const pip = & | ||
+ | ``` | ||
+ | |||
+ | ## 顶层const | ||
+ | |||
+ | 指针本身是一个对象,它又可以指向另一个对象。因此,指针本事是不是常量以及指针所指的是不是一个常量是两个相互独立的问题。 | ||
+ | |||
+ | 顶层const (top-level const) 表示指针本身是一个常量。 | ||
+ | |||
+ | 底层const (low-level const) 表示指针所指的对象是一个常量。 | ||
+ | |||
+ | 更一般的,顶层const 可以表示任意对象是常量,这一点对任何数据类型都适用。 | ||
+ | |||
+ | 例: | ||
+ | ``` | ||
+ | int i = 0; | ||
+ | int *const p1 = & | ||
+ | const int ci = 42; // 不能改变ci的值, 这是一个顶层const | ||
+ | const int *p2 = & | ||
+ | const int *const p3 = p2; // 靠右的const的顶层const, | ||
+ | const int &r = ci; // 用于声明引用的const都是底层const | ||
+ | ``` | ||
+ | |||
+ | ## constexpr 和常量表达式 | ||
+ | |||
+ | 尽管可以使用const 来定义常量表达式,例如: | ||
+ | |||
+ | ``` | ||
+ | const int max_files = 20; | ||
+ | const int limit = max_files + 1; | ||
+ | ``` |