[C++学习笔记] const限定符

2018-06-17 23:04:46来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

关于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对象变得和普通变量一样。

 

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:42:出书最多

下一篇:Effective Modern C++ Item 37:确保std::thread在销毁时是unjoi