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

本文写作时长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指针则什么都不能改变了。

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容