本文写作时长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
自身是常量,指向也是常量
总结:
-
const
修饰基本类型时,const
变量不可修改(再次被赋值) -
const
修饰引用时,const
引用(命名不准确,只读引用比较合适)可以引用常量和变量,只是无法通过只读引用去修改值,而常量只能被只读引用引用。(由于引用非变量,所以不存在const
引用,又或者说引用本身就是const
) -
const
修饰指针时,const
指针(常量指针)不可以再次指向其他变量,但是可以修改指向的变量的值,而指向const
变量的指针,不可以通过指针修改指向变量的值,但是可以再次指向其他的变量。而指向const
变量的const
指针则什么都不能改变了。
说明:只读指针 指不能通过这个指针修改指向的内容