美文网首页Cc程序员iOS进阶指南
菜鸟不哭!只需这一次,彻底搞懂const

菜鸟不哭!只需这一次,彻底搞懂const

作者: dongwenbo | 来源:发表于2017-01-17 16:45 被阅读354次

    本文写作时长4小时


    const是一种限定符,对变量的类型加以限定,使其成为不可变的变量,也就是常量。在这里,有必要说明一下,本文讨论的变量和常量并不完全对立。C++中,所有具名的、可供程序操作的存储空间,统称为变量(variable),常量就是加了限定符const的变量。

    由于const是对变量的类型加以限定,所以我们主要从变量类型入手分类讨论

    const限定基本内置类型

    C++基本内置类型包含算术类型和void类型,算术类型就是老生常谈的整型和实型,不往下细说了

    定义一个const变量(常量):

    const int bufferSize = 128;//常量定义时必须要初始化
    bufferSize = 256;//错误,常量初始化后,不可赋值
    

    常量的初始化时机有两种:

    const int bufferSize = 128;//编译时初始化
    const int bufferSize = buffer_size();//运行时初始化
    

    这种const很简单,直来直去

    const限定复合类型

    复合类型包括引用,指针等,暂时只讨论这两种

    const和引用

    在谈论const和引用之前,一定要明白,引用本身不是变量,不是对象,初始化引用就是把引用和初始值绑定在一起,而非拷贝。引用即别名(一个已经存在的变量的另外一个名字)。引用的类型由它所引用的类型决定。

    对非const变量的引用(普通引用)

    int i = 1;
    int &ri = i;
    

    对const变量(常量)的引用(引用常量的引用)

    const int i = 1;
    const int &ri = i;
    

    const修饰的引用我们称之为常引用,这其实是不准确的,因为常引用从字面上理解,就是不能再次引用其他变量的引用,这很容易引起误解,因为引用本身就是这样的特点,所以本文不称为常引用,叫引用常量的引用,或者称作只读引用

    引用常量的引用意义在于,不能通过这个引用修改引用绑定的变量的值。

    假如用普通引用引用const变量(常量)

    const int i = 1;
    int &ri = i;//错误,i是常量,ri必须是常引用
    

    这个例子就是,我说了,这个值不能变,而你却总想动个歪脑筋,说这个值可以变,你几个意思,给我乖乖加上const!

    假如用引用常量的引用引用非const变量

    int i = 1;
    const int &ri = i;
    

    i是变量,而ri本身的意思却是引用一个常量,这样是可以的,只是通过ri无法改变i的值,而通过i还是可以改变自身的值。这样做的唯一影响的就是无法通过引用改变绑定变量的值。ri自以为是的认为所绑定的变量是个常量。

    那么,经过实践,我们下一个结论:
    虽然只读引用是对常量的引用,但是编译器不会阻止你用只读引用引用变量,这么做的唯一影响就是通过这个常引用无法修改绑定变量的值,也就是说只读引用中的const只对引用进行限定。但是别搞混了,引用常量必须用只读引用。

    const和指针

    普通指针

    int i = 1;
    int *pi = &i;
    

    i自身是变量,通过指针pi也可以修改i的值,pi也可以再次指向其他变量

    指向const变量的指针

    const int i = 1;
    const int *pi = &i;
    

    判断一个变量的类型时,从变量名从右向左看,首先,*指示pi是一个指针,const int指示pi是一个指向const变量的指针。和引用类型一样,指向const变量的指针必须被声明为const(*号左侧),pi仍然可以再次指向其他变量。

    用普通指针指向const类型

    const int i = 1;
    int *pi = &i;
    

    居心叵测,行为不良!为了避免嫌疑,请加上const

    用只读指针指向非const变量

    int i = 1;
    const int *pi = &i;
    

    比较自觉,一身正气,有原则,唯一影响就是pi是个只读指针

    const指针
    指针和引用不同,指针本身是个变量(对象),可以定义const指针,也就是常量指针

    int i = 1;
    int j = 2;
    int * const pi = &i;//pi永远指向i
    pi = &j;//错误,指向i了就不能再指向别的变量了
    

    同样地,从右向左读,pi是变量名,const修饰pi,表明pi本身是一个常量,int *指示pi是一个指向int的常量指针。虽然不能再次指向别的变量,但是可以通过这个指针修改指向的变量值。

    指向常量的常量指针

    const int i = 1;
    const int * const pi = &i;
    

    pi自身是常量,指向也是常量

    总结:

    1. const 修饰基本类型时,const变量不可修改(再次被赋值)
    2. const 修饰引用时,const引用(命名不准确,只读引用比较合适)可以引用常量和变量,只是无法通过只读引用去修改值,而常量只能被只读引用引用。(由于引用非变量,所以不存在const引用,又或者说引用本身就是const
    3. const 修饰指针时,const指针(常量指针)不可以再次指向其他变量,但是可以修改指向的变量的值,而指向const变量的指针,不可以通过指针修改指向变量的值,但是可以再次指向其他的变量。而指向const变量的const指针则什么都不能改变了。

    说明:只读指针 指不能通过这个指针修改指向的内容

    相关文章

      网友评论

      本文标题:菜鸟不哭!只需这一次,彻底搞懂const

      本文链接:https://www.haomeiwen.com/subject/umpmbttx.html