前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Const的应用与备忘

Const的应用与备忘

作者头像
Oceanlong
发布2018-08-14 17:33:23
3380
发布2018-08-14 17:33:23
举报

前言

const直译“常量”。在软件的开发中,我们会经常需要定义一些不能修改的变量。但在cpp中,由于变量的结构比较复杂,对不能修改这个概念,在不同的变量类型中,const的实际意义是不同的。

因此,本文意在列举const的细节和使用场景,作为备忘。

细节

const的值无法修改

代码语言:javascript
复制
const [type] a = ...;

这样定义后,a的值就不能再修改。

const的作用域

下面论述一下const对象和普通对象的区别。

(转载于http://blog.csdn.net/yipiantiandi/article/details/5822564

(const对象默认作用域为:文件作用域)

(普通变量默认作用域:整个程序)

对于一般的对象 如 int a=9;;我们知道它的作用域是整个程序的,在1.cpp和2.cpp中包含同一个定义了int a=9;的头文件,因为int a=9;作用域是整个程序,所以会产生错误。

那为什么const int a=9;不会产生错误呢。原因就是const int a=9;的默认作用范围是文件作用域的。即,尽管在1.cpp和2.cpp中包含同一个定义了const int a=9;的头文件,但由于const int a=9;是文件作用域的,包含了头文件的1.cpp和2.cpp尽管都包含了const int a=9;但他们是各自文件内的const对象,两者互不相干,就像不同函数中定义了相同的变量名一样。

所以,通过在头文件中定义const对象,可以实现多个文件使用相同的常量值,这在实际的程序中很常见。

那么如何使用其他文件中的const

说到这里,有一点疑问需要解决:如果想在别的文件中访问本文件中的const对象该怎么办,如果都是单是在别的文件中使用extern const int a = 9;的话,不会起任何作用,因为已经提示const int a = 9;是文件作用域的。

所以应该在需要被其他文件使用的const对象定义成这样:extern const int a = 9;而在别的需要使用这个const对象的地方声明:extern const int a;前者是定义,后者是声明。这样就可以使用了。

取引用

代码语言:javascript
复制
    int a = 42;
    const int &b = a;
    a = 41;  //可以
    b = 40;  //报错

    const int r1=42;
    int &r2 = r1;  //报错 

此示例中,const int &b = a; 表示,b = a的引用,无法进行修改。但b引用的值,即a的值还是可以修改的。

指针

一图胜千言

C++常量折叠

代码语言:javascript
复制
int main()
{
    int i0 = 11;

    const int i=0;         //定义常量i
    int *j = (int *) &i;   //看到这里能对i进行取值,判断i必然后自己的内存空间
                //请注意,int *j = &i;是不对的哦,我们在第4节讲过~
    *j=1;                  //对j指向的内存进行修改
    
    printf("%d\n%d\n%d\n%d\n",&i,j,i,*j); //观看实验效果
    const int ck = 9;     //这个对照实验是为了观察,对常量ck的引用时,会产生的效果
    int ik = ck;

    int i1 = 5;           //这个对照实验是为了区别,对常量和变量的引用有什么区别
    int i2 = i1;
    

    return 0;

}

// output: 0012ff7c 0012ff7c 0 1 
  • i和j地址相同,指向同一块空间,i虽然是可折叠常量,但是,i确实有自己的空间。
  • i和j指向同一块内存,但是*j = 1对内存进行修改后,按道理来说,*j==1,i也应该等于1,而实验结果确实i实实在在的等于0,这是为什么呢,就是本文所说的内容,i是可折叠常量,在编译阶段对i的引用已经别替换为i的值了。

函数

代码语言:javascript
复制
int getAge() const;
int temp::getAge() const
{
    age+=10; // #Error...error C2166: l-value specifies const object #
    return age;
}

//返回值是指针类型,防止指针意外变化,所以用const修饰
const char* ret_p(){
    return p;
}

//char* y=a.ret_p(); 这样编译会出错,需要const 修饰的
const char* y=a.ret_p();
  • 加在后面的const表示,这个成员函数,无法修改成员变量
  • 加在前面的const表示返回值为const。只有返回指针时才有意义

成员变量

代码语言:javascript
复制
class A
{ public:
        A(int size) : SIZE(size) {}; private: const int SIZE;
};

int main()
{
    A a(100);
}

成员变量加const无法修改,也无法进行初始化。初始化工作必须在构造函数中完成。


以上就是const在c++中常见的一些使用场景。c++语法繁杂,只有多学多练,在此共勉。

如有问题,欢迎指正。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.08.13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 细节
    • const的值无法修改
      • const的作用域
        • 取引用
          • 指针
            • C++常量折叠
              • 函数
                • 成员变量
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档