1、const意味着,这个变量只能被初始化一次,而且必须在定义的时候赋值。
2、初始化方式有两种。编译时初始化 和 运行时初始化。
如果const变量用作数组下标的话,必须在编译时初始化。这时候,在文件中类似define,直接替换。
3、默认情况下,const变量被设定为仅仅在文件内有效。多个文件中同时声明了同名的const变量时,相当于在不同的文件中分别分配了内存。
这是为了方便什么? 类似于C中的宏?只在文件中有效。
main.cpp const int size = 10; void func(); int main() { int a[size]; printf("in main size is %u\n",sizeof(a)); func(); return 0; } func.cpp const int size = 5; void func() { int a[size]; printf("in func size is %u\n", sizeof(a)); }
4、如果为了在多个文件间共享const变量,应该怎么办?
在多个文件中,不管是定义还是声明,在前边都加上external语句就可以了。这时候,仍然只定义一次。其他地方只声明就好了。
例外情况就是,如果一个文件中需要用const变量作为数组的大小,那么这里的const不能用声明。必须只能是定义。
5、const修饰引用或者指针时,表示不能通过这个指针或引用修改它所指向的变量。不论这个变量是不是const。
也就是说,const变量,不能被非const的指针/引用所指向。非const变量,可以被const的指针/引用所指向。
int main() {
//例子1:没问题 int val = 10; const int &ref_i = val; const int *ptr_i = &val;
//例子2:编译错误 const int const_val = 10; int &ref_const_val = const_val; int *cptr_i = &const_val; return 0; }
非const可以生成const & 和 const *,const不能生成非const的引用和指针。
6、神奇:对字面常量的引用。
const int & a = 10;
const int & b = 2 * a;
这都可以,怎么理解?
10是一个常量,存放在文字常量区,所以a相当于对这一块内存进行了引用。
第二个呢?莫非又是编译时初始化?在文件中把a替换成了10?
未完待续。。
浙公网安备 33010602011771号