| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> C++知识整理系列(二)令人头疼的const -> 正文阅读 |
|
[C++知识库]C++知识整理系列(二)令人头疼的const |
目录一、const基础概念
但是,在C++里,const的用法是在太多太复杂了: 二、const修饰变量定义一个const修饰的常量:
将变量
因为const对象一旦创建后其值就不能改变,所以const对象需要初始化时赋值:
三、const操作限制:只能在const类型的对象上执行不改变其内容的操作。 (1)例如,const int可以和int一样,参与算术运算,也能被转换成一个布尔值。
(2)用const初始化另一个对象
四、const对象的作用域关键:默认状态下,const对象仅在文件内有效。 例如, 为什么const对象仅在单个文件内生效?
如何实现多文件共用?有一种情况,const变量初始值不是一个常量表达式,但是又有必要在文件间共享。我们希望在一个文件定义const,而在其他多个文件声明并使用它。 解决办法:对于const变量,不管是声明还是定义都添加extern关键字:
在file.c文件定义并初始化了size。在file.h文件声明了size,表示size在外部定义。 五、const的引用可以把引用绑定到const对象上,称之为:对常量的引用(reference to const)。 同样的,因为const对象是不能修改的,而对引用实际操作的也是这个对象,所以对常量的引用不能被用作修改它所绑定的对象。
常量引用是不允许修改的,假设 引用的类型必须与其所引用对象的类型一致,但是有两个例外: (1)初始化常量引用时允许用任意表达式作为初始值初始化常量引用时允许用任意类型表达式作为初始值,只要该表达式的结果能转换成引用的类型即可。尤其,允许为一个常量引用绑定非常量的对象、字面值,甚至是个一般表达式:
要想理解这种例外情况的原因,看下面的例子:
这里ri引用了一个int型的数,但是对ri的操作应该是整数运算,而dval却是一个双精度浮点数而非整数。因此为了确保ri绑定一个整数,编译器把上述代码变成如下形式:
(2)对const的引用可能引用一个并非const的对象常量引用仅对引用可参与的操作做出了限定,对于引用的对象本身是不是一个变量未作限定。因为对象也可能是个非常量,所以允许通过其他途径改变它的值:
r1的值允许修改,而r2的值不允许修改,所以可以通过修改r1的值间接做到修改r2的值。 六、const和指针指向常量的指针(指针常量)与引用一样,也可以令指针指向常量或非常量。类似于常量引用,指向常量的指针(pointer to const)不能用于改变其所指对象的值。要想存放常量对象的地址,只能使用指向常量的指针。
允许令一个指向常量的指针指向一个非常量对象:
所谓指向常量的指针,只是该指针不能修改对象的值罢了,没有规定该对象的值不能通过其他途径改变。
常量指针
(1)如下,离cur最近的符号化是const,意味着cur本身是一个常量对象。const左边是
(2)常量指针指向的是一般的非常量整数,所以修改常量指针指向的地址的值,即可以通过cur修改k的值。
顶层const顶层const:表示指针本身是个常量——常量指针。 底层cosnt:指针所指的对象是一个常量——指向常量的指针。
当执行对象的拷贝操作时,常量是顶层const还是底层const区别明显:
关键关于const和指针,const、变量类型、*的组合千千万万,关键在于:const默认作用于其左边的东西,左边无东西则作用于右边的东西。 (1)指向常量的指针(指针常量)——指针指向的对象是常量,指针的指向可以修改,但是指针指向的地址的内容不可修改。
按照规则,const优先作用于右边,否则作用左边。所以 (2)常量指针——指针本身是常量,所以指针所指向的地址不可变,但是指针指向地址的内容可以修改。
const优先作用左边 ,const修饰 (3)指向常量的常量指针——指针指向的地址不能变,指针指向的地址的内容不可变。
可以发现,这两个都是同一个东西。 总之,记住const优先作用于左边,否则作用于右边。 参考
码字不易,觉得不错的小伙伴可以一键三连支持一下~ |
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年4日历 | -2025/4/11 15:24:40- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |