标签:code 重复 操作 ons file 教材 代码 声明式 prim
关于const限定符的学习主要参考的是经典教材《C++ primer》,本文纯属学习笔记,下文中带引号的句子均为书中原话。
本人C++基础不是很牢固,文中如有任何错误理解和言论,烦请大家指出。
1、const限定符
"有时候我们希望定义这样一种变量,它的值不能被改变。"在C++中,为了满足这个要求,就可以用const限定符对变量的类型加以限定。const限定符是C++中定义常量的一种方式,还有另一种方式是使用#define定义宏常量。
2、const对象初始化
因为const对象一旦创建后其值就不能再改变,所以const对象在定义的时候就必须初始化。书中给出了const对象的两种初始化方式:
const int i = get_size(); //运行时初始化
cosnt int j = 42; //编译时初始化
const int k; //错误:k是一个未经初始化的常量
常量i是在程序运行的时候初始化,由程序获得get_size()函数的返回值并对常量i进行初始化。而常量j则是在程序编译时直接初始化为字面值常量"42"。常量k因为没有赋初始值,编译器就会报错" uninitialized const ‘k‘ "。
"const类型的对象能够完成非const类型所能参与的大部分操作,主要限制就是只能在const类型的对象上执行不改变其内容的操作,其中有一种操作就是初始化其他变量",也就是说,我们可以用const类型对象去初始化一个const类型或者非const类型的对象,如以下代码所示,可成功编译执行输出3个10。
1 int main(int argc, char *argv[]) 2 { 3 const int a = 10; 4 int b = a; 5 const int c = a; 6 cout<< a <<endl; 7 cout<< b <<endl; 8 cout<< c <<endl; 9 return 0; 10 }
3、const对象默认仅在文件内有效
"为了支持这一做法(即每一个用到该常量的文件都有该常量的定义),同时避免对同一变量的重复定义,默认情况下,const对象被设定为仅在文件内有效。"
这一句话我不是特别理解,为什么C++要让const对象仅对文件内有效?暂时做个标记把,我也没能查到相关资料。
下面只对const对象的文件内有效这个性质做个说明。
按照我的理解,与文件内有效相对的就是全局有效,定义在函数之外的普通变量是全局有效的,比如说在下面这file1.cpp和file2.cpp两个文件中都有对int型变量a的定义,那么编译器就会报错"error: multiple definition of `a‘"。也就是说对于全局有效的变量来说,在一个工程的不同文件中不能存在相同变量名的定义,为了解决这个问题我们可以更改变量名或者是使用名空间namespace。
//file1.cpp int a = 10;
1 //file2.cpp 2 int a = 5;
而const对象则没有这个限制,我们完全可以在file1.cpp和file2.cpp中定义相同名称的const对象而不会产生重定义的问题。如下所示。
1 //file1.cpp 2 const int a = 10;
1 file2.cpp 2 const int a = 5;
假如对于上面的非const型变量a,我们的本意只是想在file2.cpp中使用file1.cpp中定义的变量a,那么我们只需要将file2.cpp中变量a的定义式改为声明式即可,即将int a = 5改为extern int a,我们就可以继续在file2.cpp中使用变量a了。
而const对象则不太一样,因为const对象仅在文件内有效,所以如果需要将const对象变为全局有效,并在不同文件中使用,我们需要对const对象的定义和声明都加上extern修饰符(上面非const型的变量a则只需在声明前加上extern修饰符),即
1 //file1.cpp 2 extern const int a = 10;
1 //file2.cpp 2 extern const int a;
按照我的理解,给const对象定义加上extern修饰符的意义就似乎是将"const对象默认在文件内有效"这个性质改成全局有效一样,即将const对象变得和普通变量一样。
标签:code 重复 操作 ons file 教材 代码 声明式 prim
原文地址:http://www.cnblogs.com/c-yq/p/6562306.html