专栏首页移动开发面面观Const的应用与备忘

Const的应用与备忘

前言

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

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

细节

const的值无法修改

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;前者是定义,后者是声明。这样就可以使用了。

取引用

    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++常量折叠

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的值了。

函数

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。只有返回指针时才有意义

成员变量

class A
{ public:
        A(int size) : SIZE(size) {}; private: const int SIZE;
};

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

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


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

如有问题,欢迎指正。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java学习笔记——内存管理Java内存管理

    Oceanlong
  • Android NDK中的UI线程

    在Android中,UI线程是一个很重要的概念。我们对UI的更新和一些系统行为,都必须在UI线程(主线程)中进行调用。

    Oceanlong
  • HashTable,HashMap与ConcurrentHashMap源码分析

    Oceanlong
  • 学习c++中的小问题总结

    徐飞机
  • const的那些事

    在我们使用c/c++的时候,或者在面试的时候,会被问道与const相关的问题,比如const修饰放在指针的哪个位置,const修饰的引用传递与值传递等等,这些究...

    公众号guangcity
  • QMap容器小知识

    Qt君
  • 初级程序员面试不靠谱指南(二)

    3.read-only的const。如果你突然冒出一句看似很高深的话但又不解释一般都是装逼,就像前面提到过const准确的应该理解为一个read-only的变量...

    一心一怿
  • C++ const各种用法总结

    原文链接:https://www.toutiao.com/i6644404128439075332/

    Steve Wang
  • 【ES6基础】const介绍

    在ES6之前,JavaScript被其他编程语言诟病没有定义常量的能力,甚至在大多数企业的开发文档中,对于常量的定义都使用var。一般经常会使用大写字母和下划线...

    前端达人
  • 函数声明后面的const用法

    void function() const{} 通常我们会看到一些函数声明后面会跟着一个const,这个const是做什么的呢? 看一下下面的例子,就知道了。直...

    用户1154259

扫码关注云+社区

领取腾讯云代金券