C++ Const详解

本文详细探讨了C++中的const关键字,包括const限定符的特性,如必须初始化且值不可改变,以及const对象的作用域。此外,还讲解了const引用、指针与const的关系,特别是指针到const和const指针的区别。文章进一步阐述了顶层const和底层const的概念,以及const在函数参数中的应用,尤其是const形参的重复定义问题。同时,介绍了const成员函数在类中的作用,模板类型左值引用参数的推断,以及constexpr和常量表达式的重要性。最后,讨论了const_cast在消除对象的const属性中的应用。
摘要由CSDN通过智能技术生成

C++ Const详解

一、const限定符

1、const限定对象必须初始化

const int i = 100;   //正确:编译时初始化
const int j;         //错误:j是一个未初始化的常量

2、const限定的值不可以改变

cosnt int i = 100;
i = 5;              //错误:试图向const修饰对象写值

const类型对象能完成非const类型所能参与的大部分操作,主要是限制是
只能在const的对象上执行不改变其内容的操作。

例:

int i = 100;
const int ci = i;       //正确:i的值拷贝给ci
int j = ci;             //正确:ci的值呗拷贝给j

///<原因:拷贝一个对象并不会改变它的内容。

3、cosnt对象仅在文件中有效

如果程序包含多个文件,定义同名全局变量不加const,
由于全局变量是外部链接所以会重复定义。

//a.h
int i = 1024;    

//b.h
int i = 512;    

//c.h
int i = 2048;   

///<编译失败,重复定义

对全局变量加上const限定符,限制变量的作用域为文件内(内部链接)。
所以不会重复定义

//a.h
const int ci = 1024;     //正确

//b.h
const int ci = 512;      //正确

//c.h
const int ci = 2048;     //正确

///<编译正确
  • 如果想只需要定义一次,在多个文件之间共享这个const对象
  • 那么对于cosnt变量不管是声明还是定义都添加extern关键字。
//a.h
extern const int ci = 1024;

//b.h
extern const int ci;      //与a.h中定义的ci是同一个,值为1024

//c.h
extern const int ci;      //与a.h中定义的ci是同一个,值为1024

///<  a.h的常量用extern限定使其被其他文件使用
///<  b.h, c.h的extern指明ci并非文件独有,它的定义在别处出现

二、const的引用

1、对常量的引用

简称“常量引用”是 “对常量的引用”。
严格来说并不存在常量引用。因为引用不是一个对象。

const int ci = 1024;
const int &cri = ci;

2、对常量的引用初始化

引用类型必须与所引用对象的类型一致。但有两个例外:
第一种就是在初始化话常量引用时允许用任意表达式作为初始,只要改表达式的结果能转成引用类型即可。
第二种基类的引用绑定到派生类对象上(本文不解释)

int i = 10;
const int &cri1 = i;          // 允许将const int&绑定到一个普通的int对象上
const int &cri2 = 42;         //正确:绑定一个临时量对象
const int &cri3 = cri1 * 2;   //正确:绑定一个临时量对象
int &ri4 = cri1 * 2;          //错误:ri4是一个普通的非常量引用
double d = 3.14;
const int & cri4 = d;        //正确:绑定一个临时量对象

常量引用之所以可以这样初始化,它绑定的是一个临时量的对象
以最后一个为例,编译器把上述代码变成下面的形式:

double d = 3.14;
const int temp = d;         //由双精度浮点数生成一个临时的整型常量
const int &cri4 = temp;     //
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值