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

本文写作时长4小时

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

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指针则什么都不能改变了。

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

    原文作者:dongwenbo
    原文地址: https://www.jianshu.com/p/a24bab4ffbfb
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞