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

【go-libp2p学习笔记】使用go-libp2p搭建中转服务器(circuit relay server)

libp2p算是一个蛮新的库,提供了非常强大的p2p节点发现/连接/通信能力。IPFS的基石。 中文网上的**技术教程**比较少,所以抛砖引玉开一点坑来体验一下!

Cake_C的博客 6491

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

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

weixin_40313940的博客 267

RH850_U2A系列HSM安全核开启但是固件未烧录导致无法启动也无法再烧入固件废板问题分析解决

hsm核导致的安全锁死补救方案

u011941262的博客 1735

Unity基础篇-----Input输入

2、Input.GetTouch()方法,主要用于移动端开发使用,此方法主要获取触摸屏幕的操作数据,首先通过Input.touchCount这个方法获取到手指触摸屏幕的次数,通过GetTouch方法传输触摸次数,调用Touch结构判断手指的状态来是否为设定的状态,符合的话则执行相关内容。参数(“Horizontal”)表示左右的值,值为-1时,表示你在一直按下左方向对应的按键、设备类型为手柄时,表示你把推杆推到了最左边,为0时为默认位置,手柄中对应正中间,为1时与-1时对应的情况正好相反。

why820mmm的博客 3495

STL_multiset容器

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

weixin_42542290的博客 397

从零搭建ECG心电图仪:模拟前端电路设计与噪声对抗实战

在电子工程和生物医学信号处理领域,微弱信号的采集与放大是核心挑战。其基本原理在于利用高精度模拟电路,从强大的环境噪声中提取出有用的差分信号。这项技术的核心价值在于将理论上的传感器信号转化为稳定、可靠的可用数据,是连接物理世界与数字系统的关键桥梁。在医疗监护、工业传感和科学测量等场景中,高性能的模拟前端设计直接决定了整个系统的精度与可靠性。本文聚焦于生物电信号采集这一具体应用,深入探讨如何运用差分放大器、低通滤波器和陷波滤波器等经典模块,构建一个能够有效对抗工频干扰和接触噪声的实用电路,最终实现从人体体表清晰

weixin_30616969的博客 460

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

B站讲解视频

lxiao428的博客 737

Alphafold2/multimer Conda环境配置与GPU加速优化指南

本文详细介绍了如何在本地服务器或工作站上,通过Conda环境配置并优化GPU加速来部署Alphafold2及其多聚体版本Alphafold2-multimer。内容涵盖从硬件准备、依赖安装、数据库部署到实战预测与常见报错处理的全流程,重点解决了本地安装过程中的依赖冲突与GPU调用失败等关键问题,帮助研究人员高效运行这一蛋白质结构预测工具。

neovim7hacker的博客 470

【软考高级架构】论文范文16——论分布式缓存架构设计及其应用

随着互联网业务的快速发展,高并发访问和海量数据处理对系统响应时间提出了极高要求,传统基于磁盘的数据库存储已难以满足毫秒级的性能需求。分布式缓存作为一种高性能、可扩展的数据存储中间件,能够有效减轻后端数据库压力、加速热点数据访问、提升系统吞吐量,已成为高并发系统架构中的核心组件。本文以笔者主导的某大型电商平台秒杀系统建设项目为案例,围绕分布式缓存架构设计展开论述。笔者担任系统架构师,主导了缓存选型、数据分片策略、缓存一致性方案、高可用架构及缓存穿透/雪崩/击穿防护机制的设计与落地。

qq837993702的博客 163

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

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

ISmileLi的博客 928

YOLOv11改进 | Neck篇 | 双向特征金字塔网络BiFPN助力YOLOv11有效涨点

本文给大家带来的改进机制是BiFPN双向特征金字塔网络,其是一种特征融合层的结构,也就是我们本文改进YOLOv11模型中的Neck部分,它的主要思想是通过多层级的特征金字塔和双向信息传递来提高精度。本文给大家带来的结构可以让大家自行调节网络结构大小,同时能够达到一定的轻量化效果,为什么发BiFPN呢因为它算是YOLO系列改进中的常青树了,大家可以借鉴它的双向特征思想来创新自己的Neck结构本文的BiFPN通过yaml文件配置可以让大家自行调配其结构。

Snu77的博客 9104

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

const & constexpr

记忆超差的本人的博客 1865

在 FlexSim 中建 AGV 小车模型时,如果设定“每次充电需要 2 小时才能充满”,应该如何配置 AGV 的充电功能?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值。

**My Coding Family** 881

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

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万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

const用法详解

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

zhwlc的博客 1万+

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

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、付费专栏及课程。

余额充值