7 类-const成员

const成员变量

一、为什么会引入const

有时需要定义一个不变的量,如:用一个变量来表示缓冲区大小。这时就引入了const关键字。

二、const变量的初始化

因为const变量一旦创建后其值就不能再被修改,所以const变量必须初始化。

/* cosnt 变量的两种初始化方式 */
const int i = get_size(); //运行时初始化
const int j=42;             //编译时初始化

/*const变量和普通变量的关系*/
int i = 42;
const int ci = i; //const变量ci可以用普通变量i赋值
int j = ci;         //const变量ci可以给普通变量j赋值,相当于把ci的值拷贝一份给j,新对象和原来对象便没有关系了

三、const对象仅在文件内有效

默认情况下,const对象被设定为仅在文件内有效,当多个文件中出现了同名的const变量时,等同于分别定义了独立的变量。

当以编译时初始化定义一个const对象,编译器在编译过程中会把用到该变量的地方都替换成相应的值。

如果程序包含多个文件,则每个用了const对象的文件必须能访问到它的初始值才行。为支持这一做法,同时避免对同一变量重复定义,对于const变量不管是声明还是定义都添加extern关键词。

//file.c定义并初始化一个常量,该常量能被其他文件访问
extern const int bufsize = fcn();
//file_1.h头文件
extern const int bufsize; //与file.c中定义的bufsize是同一个

四、对const的引用(简称 "常量引用",即引用前面加const修饰词的引用)

把引用绑定到const对象上,就叫对常量的引用。对常量的引用不能被用作修改它所绑定的对象。

const int ci = 1024;
const int &r1 = ci;     //引用及其对应的对象都是常量
r1 =42;                //错误,r1是对常量的引用
int &r2 = ci;          //错误,不能用非常量引用指向常量对象

int i = 42;
const int &r1 = i; //允许将const int&绑定到普通对象上

总结:普通引用只能绑定到普通对象上,const引用可以绑定到普通对象或常量对象上。

五、指针和const

int i = 10;
const int *p1 = &i; //const放最前面表示不能通过指针p1修改i的值,但可以修改p1的指向
const int * const p2 = &i; //const放在最前面和指针变量前,表示即不能通过指针修改i的值,也不能修改p2 的指向

六、顶层const

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

底层const指,指针所指向的对象是一个常量。

int i = 0;
int *const p1 = &i; //不能改变p1的值,这是一个顶层const
const int ci = 42;   //不能改变ci的值,这是一个顶层const
const int *p2 = &ci; //允许改变p2的值,这是底层const 
const int *const p3 = p2; //靠右的是顶层const,靠左的是底层const
const int &r = ci; //用于声明引用的const都是底层const 

 

posted @ 2018-12-18 16:56  小牙签123  阅读(112)  评论(0)    收藏  举报