C++ Primer读书笔记——2.4 const限定符 (2019.8.30)

C++ Primer读书笔记——2.4 const限定符 (2019.8.30)

只能在const类型的对象上执行不改变其内容的操作。
默认情况下,const对象被设定为仅在文件内有效。如果需要在多个文件间共享,加extern。
补充:#define和const的区别:
const更优于#define,完全可以替代#define。const有数据类型,可以执行类型检查;有些调试工具可以调试const,不能调试#define

2.4.1 const的引用

const的引用,有时候称为“常量引用”都是把引用绑定到const变量上。
不能使用非常量引用指向常量变量。
引用的类型必须与引用变量的类型保持一致,但有两种例外。第一种例外是初始化常量引用时允许用任意表达式作初始值。第二种例外是可以用派生类对象指向基类的引用。
对const的引用可能引用一个并非const的对象,允许通过其他途径改变非const对象的值。

2.4.2 指针和const

要想存放常量对象的地址,必须使用指向常量的指针。
指针的类型必须与指向变量的类型保持一致,但有两种例外。第一种例外是指向常量的指针指向非常量变量。第二种例外是可以用派生类对象指向基类的指针。
所谓指向常量的指针或引用,它们自觉不去改变所指对象的值,但如果所指变量是非常量,可以通过其他途径来改变所指变量的值。
指针需要区分指针本身是const还是指针指向对象是const。常量指针必须初始化。常量指针是指针指向的对象不能变,但不代表指针不能改变其所指对象的值。

2.4.3 顶层const

顶层const表示指针本身是个常量,底层const表示指针指向对象是个常量。
除了复合类型之外,其他类型的const都是顶层const。因此顶层const可以表示任意的对象是常量,底层const与复合类型的基本类型部分有关。
指针既可以是顶层const,也可以是底层const,但是声明引用的const都是底层const。
当执行拷贝操作时,顶层const不受什么影响,拷入和拷出的对象是否是常量都不影响;拷贝时,底层const的限制不能忽略,拷入和拷出的对象都必须具有相同的底层const资格或者能相互转换,非常量可以转换成常量,反之不可以。

2.4.4 constexpr和常量表达式

常量表达式:值不会改变且在编译时就得到计算结果的表达式。
字面值属于常量表达式,用常量表达式初始化的const对象也是常量表达式。
判断一个对象或者表达式是不是常量表达式有两点:一是数据类型,二是初始值。首先初始值得是常量表达式,其次是数据类型得是const。
c++11允许把变量声明为constexpr类型以便由编译器来判断表达式是否是常量表达式。声明为constexpr的变量一定是常量,必须用常量表达式初始化。
如果认定变量是一个常量表达式,把它声明为constexpr类型。
字面值常量:算术类型、指针、引用都可以是字面值常量,自定义的类、IO类不可以是字面值常量。
一个constexpr的指针的初始值必须为nullptr或者0,或者是存放在某个固定地址中的变量。
(补充:什么是指放在固定地址中的变量?函数体内定义的变量没有存放在固定地址中,定义在函数体外的变量存放在固定地址中。函数体内定义的变量不能用来初始化constexpr变量,函数体外内定义的变量可以用来初始化constexpr变量。)
如果使用constexpr声明一个指针,constexpr仅对指针有效,与指针所指的对象无关。
例如:const int*p=nullptr;

constexpr int* q=nullptr;

p是指向常量的指针,q指针本身是常量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值