c++的const
const在C++中是一个非常重要的关键字,用于定义不可变的变量、函数参数、成员函数等。它可以提高代码的可读性、安全性,并帮助编译器进行优化。
- 定义常量
使用const定义不可变的变量:
const int MAX_SIZE = 100;
- 常量指针
指向常量的指针和常量指针有不同的用法:
const int* ptr1 = &MAX_SIZE; // 指向常量的指针
int* const ptr2 = &variable; // 常量指针
const int* const ptr3 = &MAX_SIZE; // 指向常量的常量指针
- 常量引用
常量引用用于避免不必要的复制,并且保证引用的值不会被修改:
void printValue(const int& value) {std::cout << value << std::endl;
}
- 常量成员函数
在类中,常量成员函数保证不会修改对象的成员变量:
class MyClass {
public:int getValue() const {return value;}private:int value;
};
- 常量对象
定义一个常量对象,这个对象只能调用其常量成员函数:
const MyClass obj;
obj.getValue();
- 常量成员变量
在类中定义常量成员变量,这些变量必须在构造函数的初始化列表中初始化:
class MyClass {
public:MyClass(int v) : value(v) {}const int value;
};
- 常量静态成员变量
常量静态成员变量在类中定义,但必须在类外初始化:
class MyClass {
public:static const int MAX_VALUE;
};const int MyClass::MAX_VALUE = 100;
- 常量函数参数
使用const修饰函数参数,表示参数在函数内部不会被修改:
void process(const int value) {// value 不能被修改
}
- 返回常量引用
返回常量引用以避免返回值被修改:
const std::string& getName() const {return name;
}
- 常量迭代器
使用常量迭代器来遍历容器,确保元素不会被修改:
std::vector<int> vec = {1, 2, 3, 4};
for (std::vector<int>::const_iterator it = vec.begin(); it != vec.end(); ++it) {std::cout << *it << std::endl;
}
- constexpr
constexpr在C++11中引入,用于定义在编译时计算的常量:
constexpr int getValue() {return 42;
}
constexpr int value = getValue();
- const_cast
const_cast用于移除或添加const属性,但应谨慎使用,避免违反常量性:
void modify(const int& value) {int& nonConstValue = const_cast<int&>(value);nonConstValue = 100;
}
这是一个名为modify的函数,它接受一个常量引用类型的整数参数value。
在C++中,常量引用(const reference)是对一个常量的引用。使用常量引用的主要目的是防止引用的对象被修改,同时允许该对象通过引用的方式传递,以避免复制大的对象。常量引用主要用于函数参数和返回值。
常量引用的语法
常量引用的语法如下:
const int& ref = someInt;
在这个例子中,ref是一个对整数someInt的常量引用。通过ref,可以读取someInt的值,但不能修改它。
使用常量引用的优点
-
防止修改:通过常量引用,可以确保函数不会修改传递给它的对象。例如:
void printValue(const int& value) {
std::cout << value << std::endl;
// value = 10; // 这行代码将导致编译错误
} -
效率:常量引用可以避免对象的复制,尤其是对于大对象或自定义类型。通过引用传递而不是通过值传递,可以节省内存和时间。例如:
void processLargeObject(const LargeObject& obj) {
// 处理 obj 而不复制它
} -
兼容性:常量引用可以绑定到非常量对象和临时对象,因此使用常量引用可以使函数更加通用。例如:
void showValue(const int& value) {
std::cout << value << std::endl;
}int main() {int a = 5;const int b = 10;showValue(a); // 绑定到非常量对象showValue(b); // 绑定到常量对象showValue(15); // 绑定到临时对象 }
常量引用的限制
- 不可修改:通过常量引用,无法修改引用的对象。如果需要修改对象,则不能使用常量引用。
- 不能绑定到非常量指针:常量引用不能绑定到非常量指针,但可以绑定到非常量对象。
在C++中,int& value 和 int &value 实际上是完全相同的。两者都是对整数类型的引用,并且语法上没有区别。这种不同的书写方式只是个人编码风格的差异。更详细地解释一下。
引用的基本概念
引用(reference)是C++中的一种变量类型,允许创建对另一个变量的别名。定义一个引用时,使用&符号。例如:
int a = 10;
int& ref = a;
在这个例子中,ref是一个对整数变量a的引用,ref和a指向同一个内存位置,对ref的操作实际上是对a的操作。
不同书写方式的对比
int& value
int& value = someVariable;
这种方式将&符号紧贴在类型int上,表示value是一个整数引用。很多程序员喜欢这种写法,因为它清楚地表明了value的类型是“引用”。
int &value
int &value = someVariable;
这种方式将&符号紧贴在变量名value上,这在视觉上让人觉得&是变量名的一部分。有些程序员更喜欢这种风格,因为他们认为它更直观。
编译器的处理
无论使用哪种风格,编译器都会以相同的方式处理它们。int& value 和 int &value 都表示一个对整数类型的引用,二者之间没有任何功能上的差异。以下两个例子是完全等价的:
int a = 10;
int& ref1 = a; // 引用声明方式1
int &ref2 = a; // 引用声明方式2ref1 = 20;
std::cout << a << std::endl; // 输出20
ref2 = 30;
std::cout << a << std::endl; // 输出30
综合实例
下面是一个综合使用const的例子:
#include <iostream>
#include <vector>class MyClass {
public:MyClass(int v) : value(v) {}int getValue() const {return value;}const std::vector<int>& getValues() const {return values;}void addValue(const int& v) {values.push_back(v);}private:const int value;std::vector<int> values;
};int main() {const MyClass obj(10);std::cout << obj.getValue() << std::endl;obj.addValue(1); // 常量对象调用非常量成员函数是允许的,因为非常量成员函数不修改常量成员变量const std::vector<int>& values = obj.getValues();for (std::vector<int>::const_iterator it = values.begin(); it != values.end(); ++it) {std::cout << *it << std::endl;}return 0;
}
在这个综合实例中,展示了如何在类中使用const关键字来定义常量成员变量、常量成员函数、常量参数和常量引用。通过这些实践,可以编写出更加健壮和高效的C++代码。
相关文章:
c++的const
const在C中是一个非常重要的关键字,用于定义不可变的变量、函数参数、成员函数等。它可以提高代码的可读性、安全性,并帮助编译器进行优化。 定义常量 使用const定义不可变的变量: const int MAX_SIZE 100;常量指针 指向常量的指针和常量…...
Git不想跟踪某个文件
如果你不想跟踪某个文件,可以将该文件路径添加到 .gitignore 文件中。.gitignore 文件用于告诉 Git 哪些文件或目录应该被忽略,不进行版本控制。以下是具体步骤: 编辑 .gitignore 文件:在项目的根目录下找到或创建一个 .gitignore…...
DB-GPT 文档切分报错
感谢阅读 配置完知识库,进行切分报错切分完成后,进行问答时后台日志报错 配置完知识库,进行切分报错 报的错如下 document sync error cryptography>3.1 is required for AES algorithm pip install -U cryptography 之后重新运行程序 …...
#如何使用 Qt 5.6 在 Android 上启用 NFC
如何使用 Qt 5.6 在 Android 上启用 NFC NFC 技术在 Android 应用开发中变得越来越重要。在本文中,我将介绍如何使用 Qt 5.6 来实现 Android 上的 NFC 功能。这个教程基于一个创建于 8 年 8 个月前的问题,并在 7 年 3 个月前进行了修改,讨论…...
合并排序的数组
题目链接 合并排序的数组 题目描述 注意点 A的末端有足够的缓冲空间容纳BA和B都是排序的 解答思路 最初想到的是双指针,从小到大找到合并B时应该A相应位置应该插入的元素,因为在插入的过程中B的元素会替换A原有位置的元素,所以需要先将A…...
js 复制文本带样式
一键复制带样式的html文本到邮件 <div><div idcopy-content><div style{{ fontSize: 16px,fontWeight: 500, lineHeight: 24px, color: #222, marginBottom: 16px }}>邀请您参加腾讯会议网络研讨会(Webinar)</div></div><Button …...
服务器之BIOS基础知识总结
1.BIOS是什么? BIOS全称Basic Input Output System,即基本输入输出系统,是固化在服务器主板的专用ROM上,加载在服务器硬件系统上最基本的运行程序,它位于服务器硬件和OS之间,在服务器启动过程中首先运行&am…...
FFmpeg 实现从摄像头获取流并通过RTMP推流
使用FFmpeg库实现从USB摄像头获取流并通过RTMP推流,FFmpeg版本为4.4.2-0。RTMP服务器使用的是SRS,拉流端使用VLC。 在Linux上查看摄像头信息可使用 v4l2-ctl 工具,查看命令如下: v4l2-ctl --device/dev/video0 --list-formats-e…...
学生管理系统
一、登录 用户类:属性:用户名、密码、身份证号码、手机号码 1、欢迎页面 System.out.println("欢迎来到学生管理系统"); System.out.println("请选择操作1登录 2注册 3忘记密码"); 代码实现: //欢迎页面public static…...
【linux】网络基础(3)——tcp协议
文章目录 TCP协议概括TCP头部格式TCP连接管理建立连接(三次握手)数据传输确认应答机制捎带应答 滑动窗口丢包问题 拥塞控制延时应达 终止连接(四次挥手) TCP协议概括 TCP是一个面向连接的协议,在传输数据之前需要建立连…...
[Day 21] 區塊鏈與人工智能的聯動應用:理論、技術與實踐
區塊鏈的智能合約運行機制 區塊鏈技術自比特幣誕生以來,便以其去中心化、安全性和透明性等特點引起了廣泛的關注和應用。而智能合約作為區塊鏈技術的一大創新,進一步擴展了區塊鏈的應用場景,使其不僅僅局限於數字貨幣,還可以應用…...
使用ps给gif动图抠图
目录 导入gif图片 打开时间轴 选择图片 魔棒抠图-初步抠图 套索抠图-精准抠图 导入gif图片 打开时间轴 因为gif动图实际上多张图片实现的效果,所以如果要给gif抠图,就得挨个给每个时间线的图片抠图 点击窗口->时间轴 选择图片 在时间轴上选择要…...
pmp顺利通关总结
目录 一、背景二、总结三、过程 一、背景 人活着总是想去做一些事情,通过这些事情来证明自己还活着。 而我证明自己还会活着并且活得很好的方式和途径,是通过这些东西去让自己有一个明确的边界节点;借此知识来验证自己的学习能力。 我坚定认…...
未来的钥匙在于过去:学历史的真正意义,震惊!历史竟然是偶然的?从历史中寻找未来的方向!
我们自幼接受的教育是,学历史是为了相信历史是必然的。中国人民必然战胜日寇的侵略,解放思想和改革开放必定会发生,和平和发展必定是世界的主题,中国经济必定是高速增长…… 然而,在真正的历史学家眼中,历史…...
ES6自定义模块
在ES6中,我们可以使用 export 和 import 关键字来定义和使用自定义模块。 定义模块 导出(export) 命名导出(Named Exports): 使用 export 关键字来导出模块中的变量、函数、类等。例如: // ma…...
Windows页面错误(Page Fault)写几种c++会导致,此问题的例子
在C中,直接导致Windows页面错误(Page Fault)的情景较少直接由编程错误引发,页面错误更多是由操作系统在内存管理和虚拟内存机制中处理的。不过,某些编程错误可能导致访问违规,进而间接引起操作系统报告页面…...
AC7801时钟配置流程
一 默认配置 在启动文件中,已经对时钟进行了初始化,默认按外部8M晶振,配置系统时钟为48MHZ,APB为系统时钟的2分频,为24MHZ。在system_ac780x.c文件中,可以找到下面这个系统初始化函数,里面有Se…...
加密与安全_Java 加密体系 (JCA) 和 常用的开源密码库
文章目录 Java Cryptography Architecture (JCA)开源国密库国密算法对称加密(DES/AES⇒SM4)非对称加密(RSA/ECC⇒SM2)散列(摘要/哈希)算法(MD5/SHA⇒SM3) 在线生成公钥私钥对,RSA公私钥生成参考…...
读书笔记-《Spring技术内幕》(三)MVC与Web环境
前面我们学习了 Spring 最核心的 IoC 与 AOP 模块(读书笔记-《Spring技术内幕》(一)IoC容器的实现、读书笔记-《Spring技术内幕》(二)AOP的实现),接下来继续学习 MVC,其同样也是经典…...
k8s及常用对象简介
文章目录 一、k8s是什么应用程序早期部署形式容器的引入k8s的作用 二、k8s中的常用对象1、Node获取node信息 2、Namespacenamespace的使用 3、Pod生命周期pod的使用 4、DaemonSetDaemonSet的使用 5、Deployment创建deploy 6、ReplicaSet7、StatefulSet创建StatefulSet 8、更新操…...
【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
