更多课程 选择中心

C/C++培训
达内IT学院

400-111-8989

深入理解C++的const限定符

  • 发布:C++培训
  • 来源:C++资讯
  • 时间:2020-12-24 15:53

const常量的定义及初始化

当我们需要定义一种不能被改变的变量时,可以用关键词const对变量加以限定,将变量声明为常量。需要注意的是,const对象必须进行初始化操作,并且初始化后其值不能再改变。

const int a = 10; //创建并初始化常量

const int b = get_size(); //正确,初始化操作可以为复杂的表达式

const int c; //错误,常量未进行初始化

其次,在不改变const对象的前提下,利用一个对象去初始化另一个对象时,它们的const属性被忽略不计。

int a = 10; //a不是常量

const int b = a;//正确,可以用非常量值初始化常量对象

int c = b; //正确,可以用常量对象初始化非常量对象,const在此处被忽视

const的引用

可以定义常量引用(其实是对常量的引用),需要注意的是,常量引用不能用作修改其所绑定的对象的值,这点与普通引用不同。其次,如需要对常量进行引用,必须将其声明为常量引用。⚠️注意,引用本身并不是一个对象,只是被引用对象的一个别称!!!

const int a = 10;

const int &i = a;//对常量的引用

i = 20; //错误,不能修改常量引用所绑定的值

int &j = a; //错误,a为常量,需将j声明为常量引用

需要注意的是,声明为常量引用仅仅限定了引用可参与的操作,其绑定的对象并不一定非得是常量。但不管怎样都不允许通过常量引用修改其所绑定的对象的值!

int a = 10;

const int &i = a;//正确,常量引用所绑定的对象并非一定是常量

i = 20; //错误,不允许修改常量引用绑定的对象的值

const的指针

指向常量的指针

可以定义指向常量的指针来存放常量对象的地址。注意,只能使用指向常量的指针来存放常量对象的地址!其次,与常量引用(对常量的引用)一样,指向常量的指针所指的对象也可以是非常量,但不管怎样都不允许通过指向常量的指针修改其所指向的对象的值!

const int a = 10;

int b = 20;

int *ptr1 = &a; //错误,不能用普通指针存放常量对象的地址

const int *ptr2 = &a; //正确,ptr2是指向常量的指针

*ptr2 = 20; //错误,不能改变指向常量的指针所指向的对象的值

const int *ptr3 = &b; //正确,指向常量的指针所指的对象也并非一定是一个常量

常量指针

与引用所不同的是,指针本身是一个对象,因此,指针可以本定义为常量指针,与其他常量对象一样,常量指针必须被初始化,并且一旦初始化后就不能再改变。⚠️注意,常量指针本身是一个常量对象!!!

int a = 10;

int b = 20;

int *const ptr1 = &a;//正确,定义常量指针并初始化

ptr1 = &b; //错误,常量指针一旦被初始化就不允许改变

*ptr1 = 20; //正确,可通过常量指针修改所指非常量对象的值

需要注意的是,常量指针的const含义仅仅指明自身是一个常量对象,自身的指一旦初始化后就不允许改变,但并不未规定不能通过常量指针修改其所指对象的值,能否修改常量指针所指对象的值完全取决于被指对象本身。下面,来看看这个例子:

const int b = 20;

const int *const ptr2 = &b;//正确,ptr2是指向常量对象的常量指针

*ptr2 = 30; //错误,不可通过任何途径修改常量对象(b)的值

顶层const和底层const

顶层const表示指针(可以是其他任意对象)本身是一个常量 底层const 表示指针所指对象是一个常量

int a = 10;

int b = 20;

int *const ptr1 = &a; //顶层const

ptr1 = &b; //错误,不允许改变常量指针的值

const int c = 30; //顶层const

const int *ptr2 = &c; //底层const,允许改变ptr2的值

const int *const ptr3 = &c;//第一个const是底层const,第二个const是顶层const

const int &i = c; //用于声明引用的const都是底层const!

⚠️注意,由于引用本身并不是一个对象,因此用于声明引用的const都是底层const!

常量表达式

常量表达式是指值不会改变并且在编译过程就能得到计算结果的表达式,一个表达式(对象)是不是常量表达式有它的数据类型和初始值共同决定。

const int a = 10; //a是常量表达式

const int b = a+10; //b是常量表达式

int c = 30; //c不是常量表达式,因为不是const

const int d = get_size();//d不是常量表达式,因为初始值要运行时才能获取到

可以用constexpr将变量声明为常量表达式。声明为constexpr的变量一定是常量,且必须用常量表达式初始化。

constexpr int a = 10; //20是常量表达式

constexpr int b = a+10; //a+10是常量表达式

版权声明:转载文章来自公开网络,版权归作者本人所有,推送文章除非无法确认,我们都会注明作者和来源。如果出处有误或侵犯到原作者权益,请与我们联系删除或授权事宜。

预约申请免费试听课

填写下面表单即可预约申请免费试听!怕钱不够?可就业挣钱后再付学费! 怕学不会?助教全程陪读,随时解惑!担心就业?一地学习,可全国推荐就业!

上一篇:C语言宏定义的几种使用方法
下一篇:没有下一篇了

C语言宏定义的几种使用方法

C与C++内存管理避坑指南

C/C++代码规范注释有哪些讲究?

C语言中,全局变量滥用的后果竟如此严重?

  • 扫码领取资料

    回复关键字:视频资料

    免费领取 达内课程视频学习资料

  • 搜索抖音号

    搜索抖音号:1821685962

    免费领取达内课程视频学习资料

Copyright © 2021 Tedu.cn All Rights Reserved 京ICP备08000853号-56 京公网安备 11010802029508号 达内时代科技集团有限公司 版权所有

选择城市和中心
黑龙江省

吉林省

河北省

湖南省

贵州省

云南省

广西省

海南省