C++中的const限定符的使用和作用

 更新时间:2023年05月08日 09:11:17   作者:iukam  
C++ 中的 const 限定符用于声明不可变量,即在变量声明时指定该变量的值不可修改。它的使用可以帮助程序员避免一些常见的编程错误,如误修改不应该被修改的变量的值等

const满足定义一种变量在被设置初始值后它的值不能再次被改变。

在默认状态下,const对象仅在文件内有效。

如果需要在不同文件下共享需要添加关键字extern,这样只需要定义一次就够了。

extern const int bufSize;

1、const 的引用

把引用绑定到const上,和其他对象使用一样,最大的区别在于对常量的引用不能被用作他所修改的绑定对象:

const int ci=1024;
const int &rl=ci;//正确:引用及其对应的对象都是常量
rl=42;//错误:rl是对常量的引用
int &r2=ci;//错误:试图让一个非常量引用指向一个常量对象

ci不允许赋值,当然也不可能通过引用去改变ci;

初始化和对const的引用

引用类型必须与其所引用对象的类型一直,但是有两个例外:

1)一个是初始化常量引用时允许任意表达式作为初始值,只要该表达式的结果能转化成引用的类型即可。

int i=42;
const int &rl=i;//正确:允许将const int&绑定到一个普通int对象上
const int &r2=42;//正确:r2是一个常量引用
const int &r3=rl*2;//正确:r3是一个常量引用
int &r4=rl*2;//错误:r4是一个普通非常量引用

对const的引用可能引用一个并非const对象

int i=42;
int &rl=i;//引用r1绑定到一个i对象上
const int &r2=i;//r2也绑定对象i,但不允许通过r2修改i值
r1=0;//r1并非常量,i的值修改为0
r2=0;//错误:r2是一个常量引用

2、指针和const

  • 与引用一样,也可以令指针指向常量或非常量。
  • 类似与常量引用,指向常量的指针不能用于改变其所指对象的值。
  • 和常量引用一样,指向常量的指针也没有规定其所指的对象必须是一个常量。

所以,要想存放常量对象的地址,只能使用指向常量的指针:

const double pi=3.14;// pi是个常量,它的值不能改变
double *ptr=π//错误:ptr是一个普通指针
const double *cptr=π//正确:cptr可以指向一个双精度常量
*cptr=42;//错误:不能给*cptr 赋值

指针的类型必须与其所指对象类型一致,但是有两个例外:

1、允许令一个指向常量的指针指向一个非常量对象;

double dval=3.14;
cptr=&dval;//正确:但是不能通过cptr改变dval的值

const 指针

常量指针必须初始化,而且一旦初始化完成,则它的值(也就是存放在指针中的那个地址)就不能在改变了。

指针是一个常量时,可以通过指针修改其所指对象的值,这样做完全依赖于所指对象类型。

*pip=2.72;//错误:pip是一个指向常量的指针
if(*curErr)//如果curErr所指的对象的值不为0
{
	errorHandler();
	*curErr=0; //正确:把curErr所指的对象的值重置
}

3、顶层const

  • 顶层 const (top-level const) 表示指针本身是个常量;
  • 底层 const (low-level const) 表示指针所指的对象是一个常量;

4、constexpr和常量表达式

  • 常量表达式:是指值不会改变并且在编译过程就能得到计算结果的表达式。显然,字面值是常量表达式,用常量表达式初始化的const对象也是常量表达式。
  • constexpr 变量 :在C++11 新标准规定,允许将变量声明为 constexpr 类型以便编译器来验证变量的值是否是一个常量表达式。
  • 字面值类型:指简单易见的数据类型,比如:算术类型、引用和指针等。
  • 指针和 constexpr :必须申明,在constexpr声明中定义了一个指针,限定符constexpr仅对指针有效,对指针所指的对象无关:
const int *p=nullptr;//p是一个指向整型常量的指针
constexpr int *q=nullptr;//q是一个指向整数的常量指针

与其他常量指针类似,constexpr 指针既可以指向常量也可以指向一个非常量。

到此这篇关于C++中的const限定符的使用和作用的文章就介绍到这了,更多相关C++ const限定符内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解C语言正确使用extern关键字

    详解C语言正确使用extern关键字

    这篇文章主要介绍了C语言正确使用extern关键字,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • 基于C++实现kinect+opencv 获取深度及彩色数据

    基于C++实现kinect+opencv 获取深度及彩色数据

    本文的主要思想是Kinect SDK 读取彩色、深度、骨骼信息并用OpenCV显示,非常的实用,有需要的小伙伴可以参考下
    2015-12-12
  • C++中模板和STL介绍详解

    C++中模板和STL介绍详解

    今天小编就为大家分享一篇关于C++模板和STL的介绍,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2021-09-09
  • C语言实现飞机大战

    C语言实现飞机大战

    这篇文章主要为大家详细介绍了C语言实现飞机大战,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • C语言数据类型转换实例代码

    C语言数据类型转换实例代码

    本文主要介绍C 语言数据类型转换,这里通过代码实例进行详解,这是C语言基础部分,需要的朋友可以参考下
    2016-07-07
  • 常用的C语言编程工具汇总

    常用的C语言编程工具汇总

    c语言编程软件适于编写系统软件,是学习编程的同学们的必备软件。c语言一种非常强大的计算机语言,应用非常广泛,不仅仅是在软件开发上,而且各类科研都会用到c语言。今天小编给大家汇总下C语言的编程工具
    2018-01-01
  • C语言结构体版学生成绩管理系统

    C语言结构体版学生成绩管理系统

    这篇文章主要为大家详细介绍了C语言结构体版的学生成绩管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • C++中rapidjson将map转为json的方法

    C++中rapidjson将map转为json的方法

    今天小编就为大家分享一篇关于C++中rapidjson将map转为json的方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-04-04
  • C语言 全局变量和局部变量详解及实例

    C语言 全局变量和局部变量详解及实例

    这篇文章主要介绍了C语言 全局变量和局部变量详解及实例的相关资料,需要的朋友可以参考下
    2017-01-01
  • C读txt到二维数组的实现方法

    C读txt到二维数组的实现方法

    下面小编就为大家带来一篇C读txt到二维数组的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12

最新评论