c++const限定符总结

const关键字介绍

const关键字作用的本质就是保证变量的值不改变而设计的。那什么是所谓的变量值不变呢?首先要知道变量两个组成部分一个是变量名,一个是存储空间;
注意事项:const修饰的变量必须在定义的时候初始化;const修饰的变量默认有效范围在单个文件内有效,如果要设置多个文件共享const对象,必须在变量定义之前加extern关键词;const修饰位置也是有讲究的,见第二个程序;

const int a = 1000;
a=200;  //错误,试图改变变量的值
//多个文件共享const对象
//file1.h
extern const int buffersize;  //只声明
//file2.cc
extern const int buffersize = 1024; //初始化常量(定义)

const修饰位置规则:如果修饰变量名(门牌号),就说明变量(门牌号)无法修改;如果const修饰变量的内存空间(例如 consst int),说明变量的内存空间无法修改。
const int a; 与 int const a;//是等价的,这是因为int a;变量a只能通过a才能对其内存空间赋值;
const int & a; 与 int const & a; //也是等价的,引用就是变量的别名
const int * a;  //指向常量整数的指针,很明显const修饰是变量的内存空间,因此指针a指向的内存空间无法被修改;
//例如
*a=100; // 错误
int b = 200;
a = &b; //正确
int * const a; //常量的整型指针,由于const修饰变量名本身,说明变量名无法修改,无法将指针指向另一块内存空间
//例如
*a = 100; //正确
int b = 300;
a = &b; //错误

const引用

const引用就是用const关键修饰引用变量,而引用本身就是绑定对象本身,在我看来,可以理解为const int & a 等价于绑定的对象加上了const

const引用和普通引用的区别:
const引用类型可以与其引用对象不一致(但会出问题,详细见下面程序);
const引用可以绑定非常量(const)对象、字面值甚至表达式;
普通引用无法绑定常量(const)对象。

    cout << "常量引用与普通引用对比" << endl;
    int i = 42;
    const int j = 2;
    const int &r1 = i;
    const int &r2 = 42;
    const int &r3 = r1*2;
    //int &r4 = j; //错误,普通引用无法绑定常量对象(如果可以绑定的话,const就失去意义了)

    cout << "常量引用类型与其绑定对象不一致对比" << endl;
    int a = 100;
    const int  &b = a; //这时候常量引用b是无法赋值的
    a = 300;
    cout << "a=" << a << " b=" << b  << endl; //输出结果:a=300 b=300 解释:如果类型
    //一致,常量引用b绑定的对象是变量a,因此两者都发生了改变

    double deval = 3.14;
    const int  & d = deval;
    deval = 2.14;
    cout << "deval=" << deval << " d=" << d << endl; //输出结果:deval=2.14 d=3
    //解释:常量引用在绑定对象时候c++会发生类型转换,相当于执行以下代码:
    // const int temp = deval
    // oonst int &d = temp;
    //因此,这时常量引用b绑定的是临时对象,这样一来,使用引用的意义就没有了

const指针

const指针,无论const修饰变量名还是变量内存空间,const指针和要指向的地址空间类型要一致;普通指针无法指向常量类型。

顶层const

指针本身是一个对象,并且指针指向也是一个对象,因此指针本身是不是常量以及指针指向的是不是一个常量是两个独立的问题。顶层const表示指针本身是常量,底层const表示指针指向的对象是一个常量。更一般的,顶层const表示可以任意对象(算术类型,类,指针)是常量,底层const表示指向的对象或者引用的对象是常量,根据底层const特点在c++中只有指针对象和const引用具有底层const,其中指针对象的顶层const通常是const修饰在变量前,而底层const通常修饰在类型名称前。
顶层const无法修改变量的值,底层const无法改变变量指向的值。
当执行对象拷贝时候,拷入对象和烤出对象必须具有相同的底层const或者两个对象能够转换,通常情况下,非常量可以转成常量,反之则不行。

int  i = 0;
int * const p1 = &i;  //不能改变p1的值,这是顶层const
const int ci = 42;    //不能改变ci的值,这是个顶层const
const int *p2 = &ci; //允许改变p2的值,但不允许改变p2指向整形的值,这是个底层const
const int * const p3 = p2;  //既不能改变p3的值,也不能改变p3指向的指针,这是顶层const又是个底层const
const int &r = ci; //用于声明引用的const都是底层const
//对象拷贝
int *p = p3;  //错误:p3具有底层const而,p指针没有
p2 = p3; //正确:p2和p3都具有底层const
p2 = &i; // 正确:p2具有底层const,但非常量可以转换为常量
int &r = ci; //错误:普通int引用不能与常量int绑定
const int &r2 = i; //正确,常量int引用可以绑定普通int
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,875评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,569评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,475评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,459评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,537评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,563评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,580评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,326评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,773评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,086评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,252评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,921评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,566评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,190评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,435评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,129评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,125评论 2 352

推荐阅读更多精彩内容

  • 基本内置类型 算术类型字符整型布尔值浮点数 空类型(void) 算术类型 带符号类型和无符号类型int、short...
    2625K阅读 3,166评论 0 1
  • 一、概述 用const限定来限定值不能被改变的变量。一个变量被const限定后,值不能被改变,只能在con...
    王一百阅读 630评论 2 3
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,094评论 1 32
  • 在上一节中说到了基本的指针的定义与解析,下面便是升级版,多级指针的理解: 所谓多级指针在于有多重的指针导向,因为指...
    sunsimple阅读 149评论 0 0
  • --简单的在一起又简单的分开,所有都发生的云淡风轻,就像清风划过似水的年华,未曾掀起一丝波澜。而我的记忆知道,它清...
    如你这般美好阅读 213评论 0 0