那些令人蛋疼的 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 可以使编译器保护那些不希望被改变的参数, 防止变量无意间被修改.
原文链接: https://www.cnblogs.com/negro/archive/2013/05/03/3056409.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/86959

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月9日 下午10:52
下一篇 2023年2月9日 下午10:52

相关推荐