const限定符

C++ 语法 const限定符 const限定符是常用且容易混淆的概念,很多书中讲解不清晰,甚至《C++ primer》中都有一些错误的论断或者不明确的区分,本文对const限定符做归纳总结。 一、在类型中 顶层const和底层const是一个非常容易让人遗忘和混淆的概念,这里包括常量词性(即使名词常量,也是形容词常量的)和C++类型定义从右向左的释义顺序与日常语言从左向右理解的顺序差异造成的混淆。 首先将常量指针和指向常... 阅读详情

const限定符

有时候我们希望定义这样一种变量,它的值不能被改变。为了满足这一要求,可以使用关键字const对变量的类型加以限定。

const int bufSize = 512;

这样就把bufSize定义成了一个常量。任何试图为bufSize赋值的行为都将引发错误。
因为const对象一旦创建后其值不能再改变,所以const对象必须初始化。

默认状态下,const对象仅在文件内有效。
编译器将在编译过程中把用到该变量的地方都替换成对应的值。为了执行这个替换,编译器必须知道变量的初始值。如果程序包含多个文件,则每个用了const对象的文件都必须得能访问到它的初始值才行。要做到这一点,就必须在每一个用到变量的文件中都有对它的定义。为了支持这一用法,同时避免同一变量的重复定义,默认情况下,const对象被设定为仅在文件内有效。当多个文件中出现了同名的const变量时,其实等同于在不同文件中分别定义了独立的变量。

某些时候我们需要const变量在文件间共享,让这类const对象像其他(非常量)对象一样工作,也就是说,只在一个文件中定义const,而在其他多个文件中声明并使用它。
解决办法是,对于const变量不管是声明还是定义都添加extern关键字,这样只需定义一次就可以了。

// file_1.cc定义并初始化了一个常量,该常量能被其他文件访问
extern const int bufSize = fcn();
// file_1.h头文件
exteren const int bufSize; //与file_1.cc中定义的bufSize是同一个

file_1.h头文件中的声明也由extern做了限定,其作用是指明bufSize并非本文件所独有,它的定义将在别处出现。

const的引用

可以把引用绑定到const对象上,就像绑定到其他对象上一样,我们称之为对常量的引用(reference to const)。与普通引用不同的是,对常量的引用不能被用作修改它所绑定的对象。

const int ci = 1024;
const int &r1 = ci; //引用及其对应的对象都是常量
r1 = 42;    //错误:r1是对常量的引用
int &r2 = ci;   //错误:试图让一个非常量引用指向一个常量对象

对r2的初始化时错误的,假设合法化,则可以通过r2来改变它引用对象的值,这显然是不正确的。

关于引用,引用的类型必须与其所引用的对象的类型一致。但是有两个例外,第一种例外情况就是在初始化常量引用时允许用任意表达式作为初始值,只要改表达式的结果能转换成引用的类型即可。尤其,允许为一个常量引用绑定非常量的对象、字面值,甚至是一个表达式。

int i = 42;
const int &r1 = i;  //允许将const int&绑定到一个普通int对象上
const int &r2 = 42; //正确:r1是一个常量引用
const int &r3 = r1 * 2; //正确:r3是一个常量引用
int &r4 = r1 * 2;   //错误:r4是一个普通的非常量引用

这种例外情况的原因可作这样的理解:

double dval = 3.14;
const int &ri = dval;

编译器把上述代码变成了如下形式:

const int temp = dval;  //由双精度浮点数生成一个临时的整形常量
const int &ri = temp;   //让ri绑定这个临时量

在这种情况下,ri绑定了一个临时量(temporary)对象

当ri不是常量时,下面这个语句C++将归为非法:

int &ri = dval;

如果ri不是常量,就允许对ri赋值,这样就会改变ri所引用对象的值。而此时绑定的对象是一个临时量而非dval。程序员既然让ri引用dval,就肯定想通过ri改变dval的值,否则为什么要给ri赋值呢?所以,将引用绑定到临时量上,将被视为非法行为。

指针和const

类似于常量引用,指向常量的指针(pointer to const)不能用于改变其所指对象的值。想要存放常量对象的地址,只能使用指向常量的指针。

const double pi = 3.14; //pi十个常量,它的值不能改变
double *ptr = π  //错误:ptr是一个普通指针
const double *cptr = π   //正确:cptr可以指向一个双精度常量
*cptr = 42; //错误:不能给*cptr赋值

指针的类型必须与其所指对象的类型一致,但有两种情况例外。第一种情况就是允许令一个指向常量的指针指向一个非常量对象。

const指针

指针是对象而引用不是,因此就像其他对象类型一样,允许把指针本身定位常量。常量指针(const pointer)必须初始化,而且一旦初始化完成,则它的值(也就是存放在指针中的那个地址)就不能再改变了。
把*放在const关键字之前用以说明指针是一个常量,即不变的是指针本身的值,而非指向的那个值。

int errNumb = 0;
int *const curErr = &errNumb;   //curErr将一直指向errNumb
const double pi = 3.14159;
const double *const pip;    //pip是一个指向常量对象的常量指针

顶层const

如前所述,指针本身是一个对象,它又可以指向另外一个对象。因此,指针本身是不是常量以及指针所指的是不是一个常量就是两个相互独立的问题。
用名词顶层const表示指针本身是个常量,而用名词底层const表示指针所指的对象是个常量。

更一般的,顶层const可以表示任意的对象是常量,这一点对任何数据类型都适用。底层const则与指针和引用等复合类型的基本类型部分有关。比较特殊的是,指针类型既可以是顶层const也可以是底层const。

int i = 0;
int *const p1 = &i; //不能改变p1的值,这是一个顶层const
const int ci = 42;  //不能改变ci的值,这是一个顶层const
const int *p2 = &ci;    //允许改变p2的值,这是一个底层const
const int *const p3 = p2;   //靠右的const是个顶层const,靠左的是底层const
const int &r = ci;  //用于声明引用的const都是底层const
数字IC设计实现之hierarchical flow系列(一) 数字IC设计实现之hierarchical flow系列(一) 最近这段时间小编又比较忙起来了,今天抽空来咖啡厅码字来了,刚到时脑子一片空白,不知道要分享些什么(项目结束后将会在知识星球上分享数字 IC 设计实现 Tapeout 前要review的那些 checklist)。突然间想起来有个星友希望小编分享些数字 IC 设计实现 hierarchical flow 的相关内容。考虑到现在大都采用这种方式来做 design 和实现,那就选这个 topic 了。限于篇幅和时间限制,今天只分享逻辑综合部分和布局布 阅读详情

相关推荐

抖音批量取消关注神器:5行JS代码搞定,告别手动操作(附详细步骤)

本文介绍了一种利用JS脚本在抖音创作者平台批量取消关注的高效方法。通过浏览器开发者工具执行简单的JavaScript代码,即可自动化模拟点击操作,快速清理大量关注列表,告别繁琐的手动操作。文中提供了详细的步骤和核心代码,适合有一定技术基础的用户参考。

weixin_29009971的博客 596

const限定符详解

const限定符一.前言初始化和const二.const与引用初始化和对const的引用三.const与指针const指针四.顶层const与底层const五.constexpr限定符constexpr变量 一.前言 有时我们希望定义这样一种变量,它的值不能被改变。例如,用一个变量来表示缓冲区的大小。使用变量的好处是当我们觉得缓冲区大小不再合适时,很容易对其进行调整。另一方面,也应随时警惕防止程序一不小心改变了这个值。为了满足这一要求,可以用关键字const对变量的类型加以限定: const int buf

weixin_44919944的博客 870

SAP CKMLCP 月结7大常见报错:从“未找到成本核算运行”到“物料占用”的完整解决方案

本文深入解析SAP CKMLCP月结过程中的7大常见报错,从权限问题到数据一致性错误,提供系统化的解决方案。重点解决'未找到成本核算运行'和'物料占用'等典型问题,帮助财务人员高效完成成本核算月结,确保数据准确性。

weixin_30299709的博客 416

【C++】const 限定符

对C++当中的const类型部分的内容进行学习和整理,主要的参考资料是第五版C++ Primer的第2.4节。

YGGP的博客 1504

Chapter 19 Digital Phase-Locked Loops

数字锁相环 Digital Phase-Locked Loops, 就是根据原来时钟信号, 产生新的时钟信号, which is locked or synchronized. (align 参考时钟边沿 or 在中间)

2304_76736886的博客 973

windows的rancherDesktop修改镜像源

Rancher Desktop中的“Allowed Images”功能(通常在 Preferences -> Container Engine -> Allowed Images 中找到)是用来定义一个允许拉取和推送的镜像列表的规则,例如,只允许从您组织或特定的受信任的仓库中获取镜像。如果问题依旧,请提供您Rancher Desktop的版本和当前选择的容器运行时,以便进一步协助。总结一下,对于Windows上的Rancher Desktop,如果您使用默认的。,镜像源的配置通常通过一个名为。

zwjapple的专栏 2696

C++ 学习笔记(六)(const 限定符篇)

前言:主要是自己学习过程的积累笔记,所以跳跃性比较强,建议先自学后拿来作为复习用。

张小艾博客 1792

pytorch 51 GroundingDINO模型导出tensorrt并使用c++进行部署,53ms一张图

博主基于https://github.com/hpc203/GroundingDINO-onnxrun项目分享的onnx c++推理代码,修改为GroundingDINO模型的tensorrt推理代码。对于600x400的输入,在3060显卡下,cuda 12.1,TensorRT-10.4.0,window环境下53ms处理完一张图片。

a486259的博客 1221

C++Primer const限定符

专栏简介:本专栏主要面向C++初学者,解释C++的一些基本概念和基础语言特性,涉及C++标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级程序设计技术。希望对读者有帮助!

专注于C/C++编程语言的博客,如果读者对C/C++语言有任何需要咨询的可以私信联系! 1030

Simulink仿真状态空间中状态变量时域响应

起因 今天老师留了一道关于状态空间变量响应的题,于是想用simulink仿真,一开始使用state-space模块,但是发现它只能输出y,没办法显示状态变量的变化情况。然而状态变量之间的关系都可以表示为一阶微分方程组,因此我们考虑在Simulink中搭建微分方程组来求解这个问题。 微分方程组 x1˙=x2x2˙=−4x1−5x2+1(1)\dot{x_1}=x_2\\ \dot{x_2}=-4x_...

ZYunfei的博客 7450

YOLO训练/写作脚本目录一览 | 涉及标签格式转换、数据扩充、热力图、感受野、精度曲线、数量统计等近百个脚本文件

在大家购买专栏后,便可获得全部的脚本文件。在获取到文件后,只需按照将程序放在个人项目中即可一键运行。

Limiiiing的博客 2376

不同的const限定符_限定符之const

const名叫常量限定符,用来限定特定变量,以通知编译器该变量是不可修改的。const、volatile以及restrict。他们都属于限定符。今天我们就来总结一些const限定符用法。1、修饰基本的数据类型const char n=1;char const n=1;const修饰通常在定义的时候就要赋初值,毕竟const修饰的变量在程序中不能改变,你若用它就给他初值。2、修饰常量指针与...

weixin_39585761的博客 1200

self‑improving‑agent 安装与配置指南(OpenClaw)

长期记忆错误反思用户偏好学习持续进化AI → 反思 → 学习 → 改进。

tiantiantbtb的博客 1340

C语言中的类型限定符.const限定符

目录 数组 关键字:static 运算符:&、*(一元) 如何创建并初始化数组 指针(在已学过的基础上)、指针和数组的关系 编写处理数组的函数 二维数组 人们通常借助计算机完成统计每月的支出、日降雨量、季度销售额等任 务。企业借助计算机管理薪资、库存和客户交易记录等。作为程序员,不可 避免地要处理大量相关数据。通常,数组能高效便捷地处理这种数据。第 6 章简单地介绍了数组,本章将进一步地学习如何使用数组,着重分析如何编 写处理数组的函数。这种函数把模块化编程的优势应用到数组...

Actir的博客 1812

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

C++中const限定符

一 、const限定符 有时候我们需要定义一种变量,它的值不能改变。例如:用一个变量表示缓冲区。为了满足这一要求,可以使用const限定符。const对象一旦创建后该值不可以改变,所以const对象必须初始化,可以是任意的复杂表达式。 const int buffsize = 512;//缓冲区大小 对于非const类型可以参与的操作相比,const类型可以完成大部分,限制就是在该类型的对象上的操作不能改变其内容。 如果利用一个对象去初始化另外一个对象,则它们是不是const类型都无关紧要,因为拷贝完成

一枚菜鸡 545

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

详解const限定符

const限定符 const对象 const与指针 const在*号的左侧 //int const* p1;//等价于下面的写法,推荐下面的写法 int x = 666; int y = 777; const int* p1 = &x;//point to constant objects //即指向的对象不可变,换句话说只可以读你所指的对象,但是能更改它。 p1 = &y...

Marshalldong的博客 2343

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

C++之const限定符

一般来说,如果想要定义一种变量,要求它的值不能被修改,为了满足这一个要求,可以用关键字const对变量的类型加以限定。

m0_51050554的博客 1432

限定符const用法详解

离变量最近的说明了变量的性质----pi左边是const,说明pi是一个const对象,* 说明pi是一个常量指针,而const int 说明常量指针pi指向的对象是const int 类型的变量,即整型变量。(但是,两者必须为同一类型的变量,否则,编译器将在类型转换的过程中创建临时变量,就无法通过修改p2来控制b,而是控制临时变量)(但是,两者必须为同一类型的变量,否则,编译器将在类型转换的过程中创建临时变量,就无法通过修改p2来控制b,而是控制临时变量):表示被限定的对象一旦确定,就不能被修改。

2301_79357377的博客 1724

<c++> const 常量限定符

什么是 const 常量限定符?const名叫常量限定符,用来限定特定变量,以通知编译器该变量是不可修改的。习惯性的使用const,可以避免在函数中对某些不应修改的变量造成可能的改动。

Ceylan__的博客 1392

C++基础——const限定符

C++基础——const限定符 1、const限定符 const限定符的含义是:修饰类型为常量,即用const限定符修饰的变量为不可改变的量,它可以作用于很多的类型上面,基本类型、结构体类型,指针等等 const修饰基本变量类型 const修饰基本变量类型代表着被修饰的变量有且只能被初始化一次 int main(){ const int a; //没有进行初始化,会报错,必须进行初始化 return 0; } int main(){ const int a = 10;

qq_48201696的博客 586

c++ const限定符

const限定符: 1、当某个变量不希望被改变时,使用const限定符,例如:const int i = 5;将i定义为常量,不可修改。因为const对象一旦创建后其值就不能再改变,所以const对象必须初始化。初始化方式可以是多样的: const int i = get_value(); //运行时初始化 const int i = 2;//编译时初始化 2、c和c++的const区别...

qu1993的博客 314

C++——限定符const

写在前面 这一篇博客总结一下我对于C++中const限定符的理解。由于我学习年限不长,所以不能添加很多自己实际经验的理解,所以这篇博客主要是自己查阅网上的一些资料,对资料进行整合、分类、理解,然后整理的一篇博客。一方面能帮助自己更好的理解这个灵活的限定符,另一方面提供一些自己的简单的理解。还望多多批评指正。 参考文献: C++ 中的 const 详解 《C++ Primer 中文版》 关于...

zy2317878的博客 1742

const限定符的使用

const限定符 当我们不想在程序中改变某个值时,可以使用const关键字对变量的类型加以限定。 const int bufSize = 512; //输入缓冲区大小 这样就把buffSize定义成了一个常亮,任何试图对buffSize进行赋值的行为都会依法错误。故const对象一旦创建后其值就无法改变,所以const对象必须初始化。初始值可以是任意复杂的表达式: const int i = ...

Owen Wei的博客 271

C++ const 限定符

在修饰普通变量时,在变量定义前面加上const即可。const变量在定义的时候要进行初始化,并且之后不能再给它赋值,否则会报错。

qq_52536196的博客 409
上一篇: 数据结构--字符串匹配
下一篇: 写给2017年
Nim的辙迹
博客等级 码龄10年 17粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值