const限定符

本文整理了C++ Primer中对const的使用。

1.const对象一旦创建后其值就不能改变,所以const对象必须初始化。

1 const int i = get_size();        //正确
2 const int j = 42;                //正确
3 const int k;                     //错误,k没有初始化

2.用来给const初始化的值是不是const类型都无关紧要。

1 int i = 42;              
2 const int ci = i;                 //用非const初始化const,正确
3 int j = ci;              //const给非const赋值,正确

 

3.默认状态下,const对象仅在文件内有效

const是编译器在编译过程中,把用到该变量的地方替换成相对应的值。为了实现这个替换,编译器必须知道const变量的初始值。

如果程序包含多个文件,则每个用了const对象都必须能访问到它的初始值才行。为了做到这一点,就必须在每一个用到该变量的文件中都有对它的定义。

为了支持这一用法,同时避免对同一变量的重复定义,默认情况下const对象只在文件内有效,多个文件内出现了同名const对象时,知识不同文件中分别定义了独立的变量。

扫描二维码关注公众号,回复: 118164 查看本文章

如果需要在文件内共享,那么使用extern关键字。

1 //file.cpp
2 extern const int i = 3;
3 
4 //file.h
5 extern const int i;

在cpp文件内定义并且初始化了const的i,而头文件中知识对它声明,指明i并非是本文件独有,它的定义将在别处出现。

4.const的引用(常量引用)

(1)常量引用可以绑定常量,也可以绑定非常量。

1 int i = 10;
2 const int j = 20;
3 const int &ii = i;              //常量引用可以绑定一个普通变量
4 const int &jj = j;             //常量引用可以绑定一个常量对象

当绑定一个普通变量时,不允许通过常量引用去修改变量的值,但是变量本身的值可以通过赋值、非常量引用等方式修改。如:

1 int i =42;
2 int &j = i;                                  //可以通过修改j来修改i
3 const int &k = i;                           //不能通过修改k来修改i
4 i = 24//可以通过直接赋值修改i

(2)非常量引用不可以绑定一个常量对象

1 const int i= 10;
2 int &ii = i;                //错误,i是const,不可以被修改,而ii是非常量引用,不允许通过ii去修改i

5.指针和const

顶层const:表示指针本身是个常量。

底层const:表示指针所指对象是个常量。

例如:

1 int i = 0;
2 int *const p = &i;            //顶层const,指针本身是常量
3 const int *p = &i;            //底层const,指针所指的变量是常量

声明引用的都是底层const

1 const int &j = i;            //底层const

注意:当进行拷贝操作时,可以忽略顶层const,但是不可以忽略底层const!也就是说,拷贝的双方若有一个是底层const修饰,那么另外一个也必须有底层const修饰才可以。

例如:

1 const int *p = &i;            //底层const
2 int *pp = p;                   //错误行为,pp并没有底层const

猜你喜欢

转载自www.cnblogs.com/love-jelly-pig/p/8997268.html