zoukankan      html  css  js  c++  java
  • [C++学习笔记] const限定符

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

  • 相关阅读:
    laravel疑难问题---5、laravel的api开发
    laravel报403错误
    JS数组常用方法---14、2个归并方法
    JS字符串常用方法(自)---10、总结
    JS字符串常用方法(自)---9、字符串匹配
    win7便笺元数据损坏,最新解决办法
    【转】OS X 中快速调出终端
    【转】实用API大全
    免费手机号码归属地API查询接口
    【转】Intellij IDEA 提交代码到远程GitHub仓库
  • 原文地址:https://www.cnblogs.com/c-yq/p/6562306.html
Copyright © 2011-2022 走看看