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?

 

未完待续。。

posted on 2018-01-07 14:35  newbird2017  阅读(182)  评论(0)    收藏  举报