一篇文章搞定Const限定符

RFSoC应用XCZU47DR八发八收FPGA设计方案 本文介绍了基于Xilinx XCZU47DR RFSoC芯片的八发八收FPGA设计方案。该方案采用集成射频数据转换器的SoC架构,支持8路14bit ADC(5GSPS)和8路14bit DAC(9.85GSPS),可直接处理5GHz以下射频信号。硬件设计包含高性能输入缓冲器、QMC校正和复杂混频器,适用于5G/6G通信、雷达、卫星通信等领域。文章详细阐述了ADC/DAC子系统参数,包括通道配置、采样率、带宽等特性,并提供了FPGA顶层模块的硬件接口设计,展示了多通道数据收发处理能力。该方案无需外置混频器, 阅读详情

Const限定符

const对象就是值不能被改变的“变量”,我们只能在const类型的对象上执行不改变其内容的操作。

1 初始化

const对象必须初始化,初始值可以是任意复杂的表达式。

const int i = 512;
const int j = get_size();

我们可以用非const类型的对象去初始化const对象。

int i = 512;
cosnt int ci = i;

默认情况下,const对象仅在文件内有效。如果想在多个文件间共享const对象,必须在变量的定义之前添加extern关键字。

2 const和引用

我们可以引用const对象,称之为对常量的引用(reference to const)。对常量的引用不能被用作修改它所绑定的对象。

const int ci = 1024;
const int &r1 = ci;	//正确,引用及其对应的对象都是常量
r1 = 42;			//错误,r1是对常量的引用,不能更改其所绑定的对象
int &r2 = ci;	//错误:试图让一个非常量引用指向一个常量对象
对常量的引用的初始化

在初始化对常量的引用时允许用任意表达式作为初始值(引用类型和被引用对象不一致的一个特例),只要该表达式的结果能够转化成引用的类型即可,如:非常量的对象、字面值,甚至是一般表达式。

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

对常量的引用可能引用一个并非const的对象。

int i = 42;
const int &r1 = i;

如以上代码所示,我们虽然不能直接通过r1修改i 的值,但是我们可以直接给i赋值。

由于引用本身不是一个对象,所以就没有const引用。

3 const和指针

指向常量的指针(pointer to const)

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

const double pi = 3.14;		//pi是个常量
double *ptr = π				//错误,ptr是一个普通指针
const double *cptr = π	//正确,cptr是指向常量的指针
*cptr = 42;								//错误,指向常量的指针不能改变其所指对象的值

和对常量的引用一样,指向常量的指针也没有规定其所指的对象必须是一个常量。所谓指向常量的指针仅仅要求不能通过该指针改变对象的值,而没有规定那个对象的值不能通过其他途径改变。

double dval = 1.28;
cptr = dval;

我们可以这样理解,所谓指向常量的指针或者引用,不过是指针和引用“自以为是”,它们觉得它们指向了常量,所以自觉的不去改变所指对象的值。

常量指针(const pointer)

由于指针本身是对象,我们可以把指针本身定为常量,称为常量指针。常量指针必须初始化,而且一旦初始化完成,它的值(也就是存放在指针中的那个地址)就不能改变了。(注意,常量指针要从右往左读)

int errNumb = 0;
int *const curErr = &errNumb;		//curErr将一直指向errNumb,curErr是一个指向int的常量指针
const double pi = 3.1415;
cosnt double *const pip = π	//pip是一个指向double常量的常量指针。

指针本身是一个常量并不意味着不能通过指针修改其所指对象的值,能否这样做完全依赖于所指对象的类型。例如,上面代码中的pip是一个指向常量的常量指针,那么无论是pip所指的对象值还是pip自己存储的那个地址都不能改变;而curErr指向的是一个一般的非常量整数,那么就完全可以用curErr去改变errNumb的值。

*pip = 2.72;	 //错误,pip所指的对象是常量,不能被改变
*curErr = 2;	//正确:curErr所指对象不是常量,可以通过指针改变

4 顶层const和底层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;	//p3既是顶层const,又是底层const,右边带*的const是顶层const,左边不带*的const是底层const
const int &r = ci;				//用于声明引用的const都是底层const

执行对象的拷贝操作时,常量是顶层const还是底层const区别明显,其中顶层const不受什么影响。(因为执行拷贝操作并不会改变被拷贝对象的值,因此,拷入拷出的对象是否是常量都没什么影响)

i = ci;		//正确,拷贝ci的值,ci是一个顶层const,对此操作无影响
p2 = p3;	//正确:p2和p3所指向的对象类型相同,p3顶层const的部分不影响

但是底层const的限制却不能忽视。当执行对象的拷贝操作时,拷入和拷出的对象必须具有相同的底层const资格,或者两个对象的数据类型必须能够转换。一般来说,非常量可以转化为常量,反之则不行。

int *p = p3;	//错误:p3包含底层const的定义,而p没有
p2 = p3;			//正确:p2和p3都是底层const
p2 = &i;			//正确:int*能转换成const int*
int &r = ci;	//错误:普通的int&不能绑定到int常量上
const int &r2 = i; 	//正确:const int&可以绑定到一个普通int上
基于YOLOv8的表面裂痕等缺陷检测:深度学习与UI界面的实践 本文详细介绍了如何使用YOLOv8进行表面裂痕等缺陷检测,并结合图形用户界面展示检测结果。通过YOLOv8的强大能力,我们可以实现高效、准确的表面缺陷检测,提升工业产品的质量控制水平。未来,随着深度学习技术和数据集的不断发展,表面缺陷检测的精度和速度将不断提升,应用领域也将进一步拓展。希望本文的实践能够为深度学习在工业检测领域的应用提供一些启示。 阅读详情

相关推荐

银河麒麟高级服务器操作系统V10SP2(X86)PXE无人值守批量部署实战指南

本文详细介绍了银河麒麟高级服务器操作系统V10SP2(X86)PXE无人值守批量部署的实战指南。通过PXE网络引导技术,实现全自动化、高效率的系统部署,特别适用于企业级数据中心和国产化替代项目。文章涵盖基础环境准备、关键服务配置、Kickstart高级定制及部署测试等核心内容,帮助用户快速掌握批量部署技巧。

weixin_42525637的博客 383

如何去除const成员函数的const属性

【代码】

zmhzmhzm的博客 721

深入解析数据通信中的码元速率与比特率:从基础到实战应用

本文深入解析了数据通信中的核心概念码元速率与比特率,通过生动的比喻和公式(比特率=波特率×log₂(M))揭示其本质关系。文章结合BPSK、QPSK、16QAM等调制技术,剖析了从4G/5G到LoRa等实战场景中如何权衡速率、距离与可靠性,并提供了软考真题解析与系统设计建议,帮助读者从理论到应用全面掌握数据速率优化。

weixin_29324877的博客 213

C++ 去掉const

通过模板实现去const类型

CodeHouse的博客 2771

Autoware.universe部署03:与Carla(二进制版)联调

本文介绍了 Autoware.universe 与 Carla 二进制版的联调过程。Autoware.universe 是一个开源的自动驾驶软件平台,而 Carla 则是一个用于自动驾驶仿真的开源工具。将这两者联调起来可以在仿真环境中测试和验证 Autoware.universe 的功能和性能,为自动驾驶系统的开发和测试提供有力支持。

zardforever123的博客 7369

vue2/3 - 详细实现内网使用离线高德地图功能,在vue中无需网络离线使用高德地图相关功能,高德地图如何离线加载详细教程(内网部署及使用),提供最新完整的瓦片资源下载及相关工具(示例代码,一键复制

vue,vue2,vue3,高德地图,离线使用高德地图,高德地图瓦片官方下载,vue内网使用高德地图离线无网络,断网情况下使用高德地图,vue离线高德地图教程,如何实现内网部署高德地图,无需联网离线使用,vue+ts实现离线高德地图 内网离线高德地图,如何在高德地图Vue项目中下载离线地图,高德离线地图加载不出来,高德地图离线使用不显示怎么办,怎么解决vue内网使用离线高德地图加载失败问题,vue实现离线地图+高德瓦片,vue引入高德离线地图,vue项目如何使用离线高德地图和自定义地图样式,高德离线地图的下

✅ 精选推荐文章 1万+

C++ const_cast强制去掉常量属性

#include using namespace std; const int* find(int val,const int* t, int n); int main(){ int a[]={2, 4, 6}; int* ptr;//不是const类型 ptr=const_cast(find(4, a, 3));//去掉const类型 if(ptr == 0) cout<<

2万+

【Altium Designer】Off grid pin解决方法

​今天我画完原理图编译时,出现了太多的黄色(出现warning警告提示)Off grid pin警告,这个警告并不是原理图电气连接出问题了,而是元器件或器件PIN脚没有和栅格对齐造成的原因。再编译还是出现这个警告。 最后经过不断翻阅网上经验和实践,才最终解决,本经验详细记录了解决该警告的有效方法。 解决方案:以下是问题解决步骤... ​

夜半少年的博客 7548

C++删除目标类型的const属性(const_cast)

C++删除目标类型的const属性可以采用const_cast方式进行实现。使用const_cast进行类型转换时,应确保转换后的对象确实是可修改的,否则将导致未定义行为。在使用const_cast时,应谨慎考虑是否真正需要改变const属性,避免对程序的正确性产生影响。其中,new_type表示要转换的新类型,expression表示要进行转换的表达式。是C++中的一种类型转换操作符,用于删除目标类型的const或volatile属性。

板栗的学习日常 1545

Zephyr内核——内存管理——内存堆

Zephyr提供了一组允许线程动态分配内存。

wayne2018的博客-心情驿站 772

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

C++ 添加和移除 const 属性

C++ 可以通过 const_cast 添加和移除 const 属性,可以通过 std::as_const 返回一个 reference-to-const 变量,具体例子如下: #include <iostream> #include <string> #include <format> #include <typeinfo> int main() { const char* name_const{ "Tom" }; std::cout &l

木偶不哭不笑的博客 8469

jre9下载 jdk9

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

【C 语言八股文】const 关键字 - 底层本质 + 易混场景 + 面试真题,一篇吃透

【C语言const关键字详解】本文全面解析const关键字的底层原理和实战应用。const是编译期只读约束,不同于#define的真正常量。核心用法包括:修饰变量(创建只读变量)、指针(区分const int和intconst)、函数参数(保护实参不被修改)及返回值。面试常考点涉及const与#define的区别、指针修饰的三种写法差异,以及如何(但不建议)通过指针绕过const限制。常见误区包括混淆指针修饰方式、滥用值传递参数const等。

weixin_72943539的博客 1130

怀旧版电脑GBC模拟器

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

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

C语言中const的几种用法区分

文章目录一、从const int i 说起二、const int *pi的语义三、再看int *const pi四、补充三种情况 一、从const int i 说起 你知道我们声明一个变量时象这样int i ;这个i是可能在它处重新变赋值的。如下: int i = 0; /* . . . */ i = 20; /*这里重新赋值了*/ 不过有一天我的程序可能需要这样一个变量(暂且...

Shijia Yin 396

C++函数重载:从语法糖到重载决议的深度解析与实战指南

函数重载是C++中实现静态多态的核心机制,它允许在同一作用域内定义多个同名函数,通过参数列表的差异来区分。其底层原理依赖于编译器的名字修饰技术,将参数类型信息编码到函数名中,从而在链接阶段实现唯一标识。这一特性极大地提升了代码的可读性和接口的简洁性,是构建类型安全、表达力强的API的重要基础。在工程实践中,函数重载与重载决议机制紧密相关,编译器需要根据实参类型从候选函数集中选择最佳匹配,这涉及到精确匹配、类型提升和标准转换等复杂规则。理解这些规则对于避免模糊调用错误、设计清晰的类接口至关重要。特别是在现代C

weixin_34357436的博客 428

【万字长文】一文搞定C语言指针

本文系统讲解了C语言指针的核心知识点,包括指针的本质与内存模型、核心操作与类型系统、与数组的深度关联、在函数中的高级应用、动态内存管理、与结构体的结合、const限定符的使用、常见问题与调试技巧等。文章详细剖析了指针的二重性(地址属性和类型属性)、空指针与野指针的区别、指针与数组的等价性、函数指针与回调机制、malloc/free的正确使用、结构体指针与链表实现等关键内容。同时提供了大量代码示例、内存管理最佳实践和调试方法,并推荐了进一步学习的经典书籍。

HRDMN的博客 1392

C++类型转换避坑指南:static_cast、dynamic_cast、const_cast和reinterpret_cast的实战对比

本文深入对比C++中四种显式类型转换操作符:static_cast、dynamic_cast、const_cast和reinterpret_cast的实战应用与核心差异。通过剖析典型场景、潜在风险与避坑指南,帮助开发者根据多态安全、常量性修改和底层内存操作等具体需求,选择最安全、意图最清晰的转换方式,从而编写更健壮、可维护的C++代码。

spice的博客 608

C语言系列:2、数据类型、运算符和表达式

C语言系列:2、数据类型、运算符和表达式 文章目录C语言系列:2、数据类型、运算符和表达式1. 前言2. 变量名3. 数据类型和长度3.1 基本数据类型3.2 short和long限定符3.3 signed 与unsigned限定符4. 常量4.1 整型常量和浮点型常量4.2 八进制和十六进制表示4.3 字符常量4.4 转义字符4.5 常量表达式4.6 字符串常量4.7 枚举常量5. 声明5.1 变量声明5.2 初始化5.3 const限定符6. 算术运算符7. 关系运算符和逻辑运算符7.1 关系运算符7

逍遥游的博客 642

从零理解C++四种类型转换:手把手教你static_cast、dynamic_cast的正确用法

本文深入解析C++中四种类型转换操作符的核心用法与安全边界。重点阐述static_cast用于编译期安全的常规转换,而dynamic_cast则为多态类型提供运行时安全检查,是继承体系中安全向下转换的关键工具。通过实战场景对比,帮助开发者规避常见陷阱,编写更健壮的C++代码。

w3x4y的博客 176

Learning C++ No.6【类和对象No.5】

一文带你收尾C++中的类和对象啦!

狂小伍的博客 1274

初识C++:类和对象 二

类和对象 二

wu77777777wu的博客 1332

C++自学记录(第六章)

第六章 资源释放问题 在使用过后,class类会被释放,但是如果在class种使用了string类型指针,指针指向的空间并不会被释放,所以需要使用析构函数进行手动释放,注意此处的 delete的写法 class cMystring { char *text; public: cMystring(char *str); //构造函数 void disp( ){ cout &amp;amp;amp;amp;amp;...

雨勒钟 391

C++ Lambda表达式:从匿名函数到编译器生成的闭包类

在C++编程中,函数对象(Functor)是一种重载了operator()的类,用于实现可调用行为。其原理是通过类封装状态和行为,提供比普通函数更灵活的功能。这一机制的技术价值在于支持状态保持和泛型编程,广泛应用于标准库算法和回调场景。随着C++11标准的引入,Lambda表达式作为语法糖出现,它本质上会在编译期自动生成一个唯一的匿名类类型(闭包类型),极大地简化了函数对象的定义。Lambda通过捕获列表实现闭包,支持按值和按引用捕获外部变量,同时借助mutable关键字控制内部状态的可变性。在性能方面,由

weixin_30407613的博客 427

C++可变参数模板:从原理到实战,掌握现代泛型编程核心

泛型编程是现代C++的核心范式之一,它通过模板技术实现代码的通用性和复用性。其基本原理是在编译期生成类型安全的代码,避免运行时开销。在C++11之前,模板参数数量是固定的,这限制了其处理任意数量参数的能力。可变参数模板的引入解决了这一痛点,它允许模板接受任意数量和类型的参数包,实现了真正的类型安全泛型。这项技术的核心价值在于消除代码冗余、提升表达力,并支撑了现代C++库如std::tuple、std::make_shared等的实现。通过包展开、递归实例化等机制,开发者可以构建高度灵活的通用组件。在实际工程

weixin_30896511的博客 385

C++入门指南:从环境搭建到核心语法与调试技巧

编程语言作为计算机科学的基础工具,其核心在于将人类逻辑转化为机器可执行的指令。C++作为一种中级语言,在底层内存操作与高层抽象之间取得了独特平衡,使其成为理解计算机系统原理和构建高性能软件的重要选择。从编译原理的角度看,C++代码需要通过编译器(如GCC、Clang、MSVC)转换为机器码,这个过程涉及预处理、编译、链接等多个阶段,而环境配置往往是新手面临的第一个挑战。在工程实践中,掌握指针与引用等核心概念,不仅能提升代码效率,更是理解内存模型和数据传递机制的关键。这些技术广泛应用于系统软件、游戏引擎、高频

weixin_34033624的博客 517

彻底解决Visual Studio C++链接错误LNK2001/LNK2019:原理、排查与实战

在C/C++程序开发中,编译与链接是将源代码转换为可执行文件的关键环节。编译阶段负责将单个源文件转换为包含机器代码和符号表的目标文件,而链接阶段则负责将所有目标文件和库文件组合起来,解析符号引用,生成最终的可执行程序。链接器在解析符号时,若找不到某个被引用符号的定义,就会抛出链接错误,这直接影响程序的构建与运行。理解链接错误的成因与排查方法,对于提升开发效率和代码质量至关重要。本文聚焦于Visual Studio环境下常见的LNK2001和LNK2019链接错误,通过分析符号解析、库依赖、编译设置一致性等核

an4455的博客 316

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

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

Actir的博客 1812
上一篇: ORB-SLAM3
下一篇: ORB-SLAM2安装问题
威士忌燕麦拿铁
博客等级 码龄10年 5443粉丝 86原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值