const 限定符
1、
const int BufSize = 512;
BufSize = 512;//错误,试图向const对象写值
2、因为const对象一旦创建后其值就不能被再改变,所以const对象必须初始化。一如既往,初始值可以是任意复杂的表达式;'
const int i = get_size();//正确,运行时初始化
const int j = 42; //正确,编译时初始化
const int k;//错误,k是一个未经初始化的常量
3、初始化和const
1、初始化不改变值,可用const去赋值。
2、默认状态下,const对象仅在文件内有效。
---文件内有效的解释:
当以编译时初始化的方式定义一个const对象时,就如对bufSize的定义一样,
const int bufSize = 512;//输出缓冲区大小
编译器将在编译过程中把用到该变量的对方都替换成对应的值。也就是说,编译器会找到所有代码中所有用到bufSize的地方,然后用512替换。
为了执行上述替换,编译器必须知道变量的初始值。如果程序包含多个文件,则每个用了const对象的文件都必须得能访问到它的初始值才行。要做到这一点,就必须在每一个用到变量的文件中都对它有定义。为了支持这一用法,同时避免对同一个变量的重复定义,默认情况下,const对象被设定仅在文件内有效。当多个文件出现了同名的const变量时,其实等于在不同文件中分别定义了独立的变量。
4、extern
某些时候有这样一种const变量,它的初始值不是一个常量表达式,但又确实有必要在文件间共享。这种情况下,我们不希望编译器为每个文件分别生成独立的变量。相反,我们想让这类const对象像 (非常量)对象一样工作,也就是说,只在一个文件中定义const,而在其他多个文件中声明并使用它。
解决的办法是:对于const变量不管是声明还是定义都添加extern关键字,这样只需要定义一次就可以了:
//file_1.cc定义并且初始化了一个常量,该常量能被其他文件访问。
extern const int bufSize = fcn();
extern const int bufSize;//file_1.h 头文件
//与file_1.cc中定义的bufSize是同一个
说明:定义(给值)的时候前面加上extern,表示这个变量并非本文件所独有,它的定义可以在别的地方出现,其他文件可以使用。
5、const的引用
可以把把引用绑定到const对象上,就像绑定到其他对象上一样,我们称之为“对常量的引用”。与普通引用不同的是,对常量的引用不能被用作修改它所绑定的对象。
★错误:试图让一个非常量引用指向一个常量对象
6、初始化和const的引用
★记住一个等式:
对const的引用 = 常量引用
1、之前提过,引用的类型必须与所引用的对象类型一致,现在介绍一种例外:
1、在初始化“常量引用”时允许用任意表达式作为初始值,只要该表达式的结果能转换成引用的类型即可。
尤其,允许为一个常量引用绑定非常量的对象、字面值,甚至是个一般表达式:
const &r4 = r1*2;//其中ri是一个常量引用
const int &r2 = 42;//常量引用可以绑定字面值
2、这里需要说明一下:对const的引用可能引用一个并非const对象:简而言之,即使允许用一个const引用一个非常量对象,但是不能通过这个const对象来改变这个非常量。例如:
int i = 42;
int &r1 = i;
const int &r2 = i;//r2绑定了i,但是不能通过r2改变i的值
r1 = 0;//正确
r2 = 0;//错误
1、
const int BufSize = 512;
BufSize = 512;//错误,试图向const对象写值
2、因为const对象一旦创建后其值就不能被再改变,所以const对象必须初始化。一如既往,初始值可以是任意复杂的表达式;'
const int i = get_size();//正确,运行时初始化
const int j = 42; //正确,编译时初始化
const int k;//错误,k是一个未经初始化的常量
3、初始化和const
1、初始化不改变值,可用const去赋值。
2、默认状态下,const对象仅在文件内有效。
---文件内有效的解释:
当以编译时初始化的方式定义一个const对象时,就如对bufSize的定义一样,
const int bufSize = 512;//输出缓冲区大小
编译器将在编译过程中把用到该变量的对方都替换成对应的值。也就是说,编译器会找到所有代码中所有用到bufSize的地方,然后用512替换。
为了执行上述替换,编译器必须知道变量的初始值。如果程序包含多个文件,则每个用了const对象的文件都必须得能访问到它的初始值才行。要做到这一点,就必须在每一个用到变量的文件中都对它有定义。为了支持这一用法,同时避免对同一个变量的重复定义,默认情况下,const对象被设定仅在文件内有效。当多个文件出现了同名的const变量时,其实等于在不同文件中分别定义了独立的变量。
4、extern
某些时候有这样一种const变量,它的初始值不是一个常量表达式,但又确实有必要在文件间共享。这种情况下,我们不希望编译器为每个文件分别生成独立的变量。相反,我们想让这类const对象像 (非常量)对象一样工作,也就是说,只在一个文件中定义const,而在其他多个文件中声明并使用它。
解决的办法是:对于const变量不管是声明还是定义都添加extern关键字,这样只需要定义一次就可以了:
//file_1.cc定义并且初始化了一个常量,该常量能被其他文件访问。
extern const int bufSize = fcn();
extern const int bufSize;//file_1.h 头文件
//与file_1.cc中定义的bufSize是同一个
说明:定义(给值)的时候前面加上extern,表示这个变量并非本文件所独有,它的定义可以在别的地方出现,其他文件可以使用。
5、const的引用
可以把把引用绑定到const对象上,就像绑定到其他对象上一样,我们称之为“对常量的引用”。与普通引用不同的是,对常量的引用不能被用作修改它所绑定的对象。
★错误:试图让一个非常量引用指向一个常量对象
6、初始化和const的引用
★记住一个等式:
对const的引用 = 常量引用
1、之前提过,引用的类型必须与所引用的对象类型一致,现在介绍一种例外:
1、在初始化“常量引用”时允许用任意表达式作为初始值,只要该表达式的结果能转换成引用的类型即可。
尤其,允许为一个常量引用绑定非常量的对象、字面值,甚至是个一般表达式:
const &r4 = r1*2;//其中ri是一个常量引用
const int &r2 = 42;//常量引用可以绑定字面值
2、这里需要说明一下:对const的引用可能引用一个并非const对象:简而言之,即使允许用一个const引用一个非常量对象,但是不能通过这个const对象来改变这个非常量。例如:
int i = 42;
int &r1 = i;
const int &r2 = i;//r2绑定了i,但是不能通过r2改变i的值
r1 = 0;//正确
r2 = 0;//错误