c++中为什么会引入const

C++11 constexpr和const的区别详解 我们知道,constexpr 是 C++ 11 标准新添加的关键字,在此之前(C++ 98/03标准)只有 const 关键字,其在实际使用中经常会表现出两种不同的语义。举个例子: #include <iostream> #include <array> using namespace std; void dis_1(const int x) { //错误,x是只读的变量 array <int,x> myarr{1,2,3,4,5}; cou 阅读详情

c++的提出者当初是基于什么样的目的引入(或者说保留)const关键字呢?,这是一个有趣又有益的话题,对理解const很有帮助。

1. 大家知道,c++有一个类型严格的编译系统,这使得c++程序的错误在编译阶段即

可发现许多,从而使得出错率大为减少,因此,也成为了c++与c相比,有着突出优点

的一个方面。

2. c中很常见的预处理指令 #define variablename variablevalue 可以很方便地进行值替

代,这种值替代至少在三个方面优点突出:

一是避免了意义模糊的数字出现,使得程序语义流畅清晰,如下例:
#define user_num_max 107 这样就避免了直接使用107带来的困惑。

二是可以很方便地进行参数的调整与修改,如上例,当人数由107变为201时,进

改动此处即可,

三是提高了程序的执行效率,由于使用了预编译器进行值替代,并不需要为这些

常量分配存储空间,所以执行的效率较高。

鉴于以上的优点,这种预定义指令的使用在程序中随处可见。

3. 说到这里,大家可能会迷惑上述的1点、2点与const有什么关系呢?,好,请接着向下

看来:

预处理语句虽然有以上的许多优点,但它有个比较致命的缺点,即,预处理语句

仅仅只是简单值替代,缺乏类型的检测机制。这样预处理语句就不能享受c++严格类

型检查的好处,从而可能成为引发一系列错误的隐患。

4.好了,第一阶段结论出来了:
结论: const 推出的初始目的,正是为了取代预编译指令,消除它的缺点,同时继承

它的优点。

现在它的形式变成了:

const datatype variablename = variablevalue ;
为什么const能很好地取代预定义语句?
const 到底有什么大神通,使它可以振臂一挥取代预定义语句呢?

1. 首先,以const 修饰的常量值,具有不可变性,这是它能取代预定义语句的基础。

2. 第二,很明显,它也同样可以避免意义模糊的数字出现,同样可以很方便地进行

参数的调整和修改。

3. 第三,c++的编译器通常不为普通const常量分配存储空间,而是将它们保存在符

号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的

效率也很高,同时,这也是它取代预定义语句的重要基础。

这里,我要提一下,为什么说这一点是也是它能取代预定义语句的基础,这是因为,

编译器不会去读存储的内容,如果编译器为const分配了存储空间,它就不能够成为一

个编译期间的常量了。

4. 最后,const定义也像一个普通的变量定义一样,它会由编译器对它进行类型的检

测,消除了预定义语句的隐患。

const 使用情况分类详析

1.const 用于指针的两种情况分析:
int const *a; file://a/可变,*a不可变
int *const a; file://a/不可变,*a可变

分析:const 是一个左结合的类型修饰符,它与其左侧的类型修饰符和为一个类型

修饰符,所以,int const 限定 *a,不限定a。int *const 限定a,不限定*a。

2.const 限定函数的传递值参数:

void fun(const int var);

分析:上述写法限定参数在函数体中不可被改变。由值传递的特点可知,var在函

数体中的改变不会影响到函数外部。所以,此限定与函数的使用者无关,仅与函数的

编写者有关。
结论:最好在函数的内部进行限定,对外部调用者屏蔽,以免引起困惑。如可改写如

下:

void fun(int var){
const int & varalias = var;

varalias ....

.....

}

3.const 限定函数的值型返回值:

const int fun1();

const myclass fun2();

分析:上述写法限定函数的返回值不可被更新,当函数返回内部的类型时(如fun1)

,已经是一个数值,当然不可被赋值更新,所以,此时const无意义,最好去掉,以免

困惑。当函数返回自定义的类型时(如fun2),这个类型仍然包含可以被赋值的变量

成员,所以,此时有意义。

4. 传递与返回地址: 此种情况最为常见,由地址变量的特点可知,适当使用const,意

义昭然。

5. const 限定类的成员函数:

class classname {

public:

int fun() const;

.....

}

注意:采用此种const 后置的形式是一种规定,亦为了不引起混淆。在此函数的声

明中和定义中均要使用const,因为const已经成为类型信息的一部分。

获得能力:可以操作常量对象。

失去能力:不能修改类的数据成员,不能在函数中调用其他不是const的函数。


 

const描述符可修饰全局函数吗?为什么C#有const和readonly两种常量关键字?C++成员函数为什么可以由const和非const版本?const常量的不同形式? C++可以用const修饰成员函数,表示成员函数不会修改任何类成员,这是安全的编码习惯。注意,这仅仅适用于类的成员函数,如果是形如C语言的全局函数,是不可以用const修饰。但,const可以修饰函数参数。 阅读详情

相关推荐

条款13:优先选用const_iterator,而非iterator

摘要:优先选用const_iterator的实践指南 在STL中,const_iterator(指向不可修改元素的迭代器)比普通iterator更安全、更清晰地表达“只读”意图。C++98中由于支持不足(创建困难、使用受限),其优势难以发挥;但C++11通过cbegin()/cend()等成员函数和非成员函数std::begin()显著改善了可用性。 核心建议: 默认使用const_iterator:除非需要修改元素,否则优先选择它以避免意外修改,增强代码安全性。 C++11/14优化:利用非成员函数(如s

大胡子的博客 2256

<C++>快速掌握set 容器|去重的底层原因|使用仿函数定义排序规则

set 容器的底层实现是二叉树,在插入元素的时候会自动进行升序的排序操作,set 容器有去重的功能,而 multiset容器允许插入相同元素… set容器在STL编程里常常用到,那么我就总结一下它的用法,抓住源码分析去重、排序的原理

叶落秋白的博客 3262

C++中为什么char**不能转换成const char**? 探索C语言和C++中const的美丽故事

本文从一个大家很可能遇到的C++bug中引出对C/C++历史的探索, 并通过实验等方式结合资料分析了这个bug的根源问题, 最后给出了多种优秀的解决方案。

weixin_43558951的博客 2343

【基本容器的使用】

容器

江边小客的博客 269

C++中const的理解

详细介绍C++语言的const关键字的各种用法。

weixin_42026107的博客 4964

void f(const int n)和void f(int n)为什么是重定义?C++成员函数为什么可以有const和非const版本?为什么C#有const和readonly两种常量关键字?

函数参数用const修饰,const不影响函数签名,所以这样的函数定义是重定义。编译器看到参数有const,只是为了确保代码不会意外传入非const参数,而并不是生成了一个带const区分符的不同函数。它与类const成员函数不同,这是用于区分const对象和非const对象。

编程语言开发、框架原理、编程思想、最佳实践技巧经验分享。致力于各种编程技术的技巧经验干货分享,讲解开发避坑技巧,追踪开发前沿技术,实战展开解决难题。 程序员小迷助您在编程路上越走越好! 844

C++STL为什么要有const_iterator

这是个困扰我很久了的问题,可能一开始对面向对象的理解不够深。 刚刚想明白了,随手记录一下。 先从const iterator和const_iterator说起 const iterator 是iterator本身是个常量,iterator本身里面存的是指针,也就是iterator的值,也就是那个指针不能改变,也就是不能指向其他的位置,但是所指向的位置的元素是可以通过这个iter...

weixin_30687587的博客 603

西门子机床数据采集实战:从828D到840DSL的CNC设备联网与实时监控

本文深入探讨了西门子机床数据采集的实战方案,重点解析了从828D到840DSL等CNC设备如何实现免授权、低成本联网与实时监控。文章通过对比不同型号系统的数据接口差异,提供了详细的配置步骤、核心数据点清单以及避坑指南,旨在帮助工厂技术人员经济高效地挖掘机床数据价值,提升生产管理效率。

weixin_29181861的博客 1331

我的C++primer长征之路:关联容器

关联容器 概述 关联容器支持普通容器的操作,不支持顺序容器中位置相关的操作,如push_back等,也不支持构造函数或插入操作的接收一个元素值和数量值得操作,如vectorv(10,0)。 普通容器的操作 类型别名 iterator 此容器类型的迭代器 const_iterator 可以读取元素,但不能修改元素的迭代器类型 size_type 无符号整数类型,足够保...

weixin_40313940的博客 267

DRAM刷新refresh相关知识归类-基础小知识(三)

RAM每一位数据都是通过芯片内的一个小电容充电(或低电平)存储的。但随着时间的推移,电容逐渐失去电荷。为避免丢失存储的数据,必须定期刷新以将电荷(如果存在)恢复到其原始级别。此刷新过程包括读取每个位的值,然后将其写回。在此“刷新”期间,内存被占用,无法执行加载或存储位等正常操作。知道了应该这么做,但怎么去做以及有什么办法更有效率去做,就是接下来要整理的内容。

Paul 安的博客 1万+

IC617多线程仿真卡死?手把手教你用TigerVNC替换解决ADE XL Explorer问题(附Manjaro/Centos8实测)

本文针对IC617在Manjaro、CentOS 8等高版本Linux系统中运行ADE XL Explorer进行多线程仿真时出现的卡死问题,提供了详细的诊断与解决方案。文章指出问题根源在于软件内置的旧版VNC组件不兼容,并手把手指导用户通过使用TigerVNC替换原组件来彻底解决,附有在Manjaro和CentOS 8系统上的实测步骤与验证方法。

hill8的博客 774

STL_multiset容器

与set的不同: 可以存储多个值相同的元素。 成员方法: 成员方法 功能 begin() 返回指向容器中第一个(注意,是已排好序的第一个)元素的双向迭代器。如果 multiset 容器用 const 限定,则该方法返回的是 const 类型的双向迭代器。 end() 返回指向容器最后一个元素(注意,是已排好序的最后一个)所在位置后一个位置的双向迭代器,通常和 begin() 结合使用。如果 multiset 容器用 const 限定,则该方法返回的是 const 类型的

weixin_42542290的博客 397

使用GDScript(godot)生成仿杀戮尖塔地图

使用GDScript(godot)生成仿杀戮尖塔地图 extends Node2D export (PackedScene) var Ball var 被连接数 = {} # 每个怪物被下层怪物连接的数量 最多为2 var 连接1 = {} # 第一次连接的上层怪物位置 var 连接2 = {} # 第二次连接的上层怪物位置 var 怪物数量 = [0,0,0,0,0,0,0,0,0,0,0,0,0,0] # 每层怪物的数量 var 总层数 =8 # 总层数 var 怪物坐标行 = {} #

weixin_45038716的博客 3010

【C++面试100问】第八十五问:有了const,C++11为什么还要引入constexpr

B站讲解视频

lxiao428的博客 737

CVPR 2026 即插即用 | 注意力篇 | MSEF:超轻注意力,空间-通道双分支并行融合,既增强特征又抑制噪声!

Multinex提出了一种超轻量级微光图像增强框架,其核心创新是MSEF模块。MSEF采用双分支并行架构,结合空间局部特征(深度可分离卷积)和全局通道注意力(改进SE),通过Tanh激活实现特征增强与抑制。相比传统注意力模块,MSEF在几乎不增加计算量的情况下显著提升性能,特别适合轻量级网络和边缘设备部署。实验表明,该模块能有效提升PSNR约3dB,同时保持极低的参数量(0.7K-45K)。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 604

pyecharts在jupyter notebook中不能够渲染图表问题。

在使用jupyter notebook中使用pyecharts绘制可视化图表的时候,发现图表不能渲染到页面中,生成的html是没问题的,本文主要解决在jupyter notebook中不能渲染这个问题。

猿小白的博客 1167

C++已经有了const,为什么还要增加一个新关键字constexpr?

const和constexpr一、可执行程序的出生过程一、const和constexpr二、必须使用constexpr的场景三、const和constexpr区别与联系 一、可执行程序的出生过程 一个源程序到一个可执行程序的过程必须经过预编译、编译、汇编、链接,最后打包成可执行的程序。 预编译会处理各种条件编译指令,如#if、#endif等,对#define等进行宏展开,保留一些必要编译指令如#pragma,删除一些不必要的注释等等,预编译是为了后面的编译做准备。 编译会把预编译生成的.i/.ii文件进行语

ISmileLi的博客 928

C# + YOLO 实时摄像头检测:Emgu CV + ONNX Runtime,30FPS+ 流畅运行

很多教程只给“单张图片推理”代码,一上摄像头就卡成 PPT(<5 FPS)。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 215

【CPP】const放在不同位置的作用

const & constexpr

记忆超差的本人的博客 1865

主成分分析(PCA)简洁高效MATLAB实现详解

本文介绍了一个简洁高效的PCA算法实现。该实现通过SVD分解计算主成分,避免了显式协方差矩阵计算,支持两种降维方式:固定维度或按能量比例自动选择。核心步骤包括数据中心化、SVD分解和维度选择,代码量少但功能完整,适用于数据预处理、降维和特征提取等任务。实现中考虑了稀疏矩阵转换、默认参数处理等细节,可直接应用于MATLAB环境。

m0_62153576的博客 64

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

C++中const变量的修改与赋值

title: C++中const变量的修改与赋值 date: 2021-02-25 20:26:16 description: C++中const变量的修改与赋值  出于避免对数据的无意修改的需求,C及C++语言引入了const关键字。与C语言中的const相比,C++中的const具有更丰富的用法。C++中的const除了可用于修饰变量,指针,函数及函数参数,还可用于修饰类对象,类成员,类成员函数等。由于其丰富的用途,往往容易对其产生误解,尤其是与指针用法结合在一起时。下面以一些实例来说明这个问题。 .

qq_38877888的博客 2万+

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

const用法详解

const (1)可以定义 const 常量 (2)const 可以修饰函数的参数、返回值. 加粗样式 详细内容: 1、什么是const? 常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的。(当然,我们可以偷梁换柱进行更新:) 2、为什么引入const? const 推出的初始目的,正是为了取代预编译指令,消除它的缺点,同时继承它的优点。 3、cons有什么主要的...

zhwlc的博客 1万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

C++中的const_c++ const变量

C++ 中的 const 变量虽然也会占用内存,也能使用获取得它的地址,但是在使用时却更像编译时期的#define;#define也是值替换,可见范围也仅限于当前文件。很多C++教程在对比 const 和 #define 的优缺点时提到,#define 定义的常量仅仅是字符串的替换,不会进行类型检查,而 const 定义的常量是有类型的,编译器会进行类型检查,相对来说比 #define 更安全,所以鼓励大家使用 const 代替 #define。

2401_84240431的博客 968

C++中我如何合理使用const和constexpr?

constexpr所限定的变量必须是编译阶段完成的变量,当我们用非编译阶段完成的变量给constexpr限定的指针赋值时,便会发成错误。的 “条款3:尽可能使用const” 就指出const在指针运用中约束的不同——如果关键字const出现在星号左边,表示被指物是常量;使用constexpr限定的函数实际上是将函数在编译过程中转换为常量表达式,在其中加入复杂语句,可能会导致常量表达式转换失败。除非有非得使用const的情况发生,否则可使用const的地方,一律可改为使用constexpr。

2401_82410644的博客 1111

C++ const 深度解析:从常量定义到编译器优化,彻底理解 const 的全部用法

fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;fill:#333;height:1em;const在左侧const在右侧const同时在两侧遇到 const 和指针声明从右往左读类型const 出现在哪?底层 const指向的内容不可修改指针本身可以指向别处顶层 const指针本身不可修改指向的内容可以修改两层 const指针本身不可修改。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 1387

c++ const 关键字

C++中的const关键字用于定义常量,确保数据不可变性和代码安全性。主要用法包括:定义常量变量替代宏常量、修饰指针(指向常量/常量指针)、函数参数保护、类const成员函数等。const提供类型安全、明确设计意图,constexpr则用于编译期常量。最佳实践建议默认使用const,避免修改不必要的数据,但需谨慎使用const_cast强制转换。合理使用const能提高代码可读性、安全性和性能。

如梦人身 913
上一篇: Giving a .NET Assembly a Strong Name
下一篇: [翻译]C#中的泛型 (From dotNet SDK 2.0 Beta1)
lakeaustin
博客等级 码龄22年 0粉丝 4原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值