那些令人蛋疼的 const 写法总结
1 /** 2 const 总是向右结合 3 eg, 4 当和 * 结合的时候表明: 变量的值作为一个地址, 而这个地址所指向的内容是常量. 5 当和变量名结合的时候, 表明这个变量本身的值是一个常量. (如果这个变量是一个指针, 那么变量本身的值是一个地址, 这个地址所指向的内容不一定是常量) 6 (const 和类型结合没有意义) 7 */ 8 #include <iostream> 9 10 using namespace std; 11 12 int main(void) 13 { 14 int i = 0; 15 const* int a = &i; // warning C4518: 'int ' : storage-class or type specifier(s) unexpected here; ignored 16 // 这时, a 的类型等同于 int const* (VC 6.0 默认数据类型为 int) 17 const int* b = &i; 18 int const* c = &i; 19 int* const d = &i; 20 const int* const e = &i; 21 char* const pstr1 = "con1"; // "con1" 是一个字符串常量, 由于 pstr1 没有提供存储空间 22 // (如果 pstr1 提供了存储空间, 需要使用 strcpy ),一般的编译器会将 "con1" 存储在常量区, 所以, pstr1 的类型为 const char* const 23 char const pstr2[] = "con2"; // 等同于 const char pstr2[] = "con2"; 24 const char pstr3[] = "con3"; // pstr2, pstr3 类型一致, (可以看出 const 不会和类型结合) 25 char pstr4[] = "con4"; // 由于数组名相当于是常指针 (即不能改变自身的值) 所以 实际上 pstr2, pstr3, pstr4 类型一致 26 a++; 27 b++; 28 c++; 29 d++; // error C2166: l-value specifies const object 30 e++; // error C2166: l-value specifies const object 31 *a = 1; // error C2166: l-value specifies const object 32 *b = 1; // error C2166: l-value specifies const object 33 *c = 1; // error C2166: l-value specifies const object 34 *d = 1; 35 *e = 1; // error C2166: l-value specifies const object 36 return 0; 37 }
关键字 const 的含义以及作用:
在 C++ 中 const 意味着常量.
(而在 ANSI C 关键字 const 意味着 "只读" (而不是"常量", 只有 enum 和 define 才能定义"常量"))
const 的作用:
(1), const 能给阅读你代码的人传达非常有用的信息, 能告诉用户这个参数的作用.
(2), 编译器能够对 const 变量产生更紧凑的代码.
(3), 合理的使用 const 可以使编译器保护那些不希望被改变的参数, 防止变量无意间被修改.