【C/C++基础知识】const 关键字

文章目录

    • Q&A and 前言
    • const 修饰基本变量
      • 初始化
      • const 对象仅在文件内有效
    • const 的引用
      • 应用
    • 指针与 const
    • const 修饰类成员函数
    • 参考
    • 写在最后

Q&A and 前言

Q:简要说一说 C++ 中的 const 关键字,含义以及常见的使用位置

A:const 是 C++ 中的一种关键字,用来对变量加以限制,无法被修改,额…

Q:具体说一下常量指针与指针常量,以及你是如何区分的

A:常量指针是 const pointer,指针常量是 pointer to const,额…

Q:好的,今天的面试到此结束,出去把门带上…


const 关键字是 C++程序语言开发岗位 面试经常考察的一个知识点,这个问题牵涉的考察面特别广,从 const 能问到指针、指针常量、常量指针、指向常量的常量指针、常量引用、常函数,甚至能问到函数的几种传参形式。今天就来看一看 const 关键字的几种用法。

const 修饰基本变量

有时候我们想定义一种值不能被改变的变量。例如,用一个变量来表示缓冲区的大小。使用变量的好处是当我们觉得缓冲区的大小不合适的时候,很容易可以对其进行调整。另一方面,我们应该防止程序一不小心改变了这个值。为了满足这一要求,可以将这一变量定义为 const 类型加以限制:

const int bufferSize = 512;

这样就把 bufferSize 定义成一个常量。任何试图为 bufferSize 赋值的行为都会引发错误。

初始化

const 是英文单词 constant 的缩写形式,表示常数、恒定的意思。使用该关键字修饰变量表示变量是恒定的,不可以改变的。因为 const 对象一旦创建后其值不能被改变,所以 const 对象必须初始化。初始值可以是任何复杂的表达式:

const int i = get_size();  // 正确:运行时初始化
const int j = 42;		  // 正确:编译时初始化
const int k;			  // 错误:没有初始化

不论是常量对象还是非常量对象都可以初始化常量对象,同样的普通对象也可以使用常量对象进行初始化。

int i = 42;
const int ci = i;		// 正确:i的值被拷贝给了 ci
int j = c1;			    // 正确:ci 的值被拷贝给了 j

尽管 ci 是整型常量,但无论如何 ci 中的值还是一个整型数。ci 的常量特征仅仅在执行改变 ci 的操作时才会发挥作用。当用 ci 去初始化 j 时,根本无须在意 ci 是不是一个常量。

const 对象仅在文件内有效

当以编译器初始化的方式定义一个 const 对象时:

const int bufferSize = 512;

编译器将在编译过程中把用到 bufferSize 的地方都替换为 512.

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

有些时候,我们希望在一个文件中定义 const 变量,在其他文件中声明并使用。解决的方法是,对于 const 变量不管是声明还是定义都增加 extern 关键字,这样只需要定义一次就可以了:

// file1.cpp 定义并初始化一个常量,该常量能被其他文件访问
extern const int bufferSize = fcn();
// file2.h
extern const int bufferSize;	// 与 file1.cpp 中定义的 bufferSize 是同一个

如果想在多个文件之间共享 const 对象,必须在变量的定义之前添加 extern 关键字。

const 的引用

引用可以绑定在常量对象上,也可以绑定在非常量对象上。无论引用的对象是常量还是非常量都不会影响引用和对象的绑定关系本身。只有那些不能通过引用改变它绑定的对象的引用,才被称为常量引用。换言之,常量运用不能通过引用改变它绑定的对象。

常量引用仅对引用可参与的操作做出了限定,对于引用的对象本身是不是一个常量未做限定。因为对象可能是个非常量,所以允许通过其他途径改变它的值:

int i = 42;
int &r1 = i;		// 引用 r1 绑定对象 i
const int &r2 = i;	// r2 也绑定对象 i,但是不允许通过 r2 修改 i 的值
r1 = 0;				// r1 并非常量,可以通过引用 r1 修改 i
r2 = 0;				// 错误:r2 是一个常量引用

应用

常量引用主要用于以下几种情况:

函数参数传递:在函数定义中,使用常量引用作为参数,可以确保传递给函数的参数不会被修改,并且避免了不必要的数据复制。

void myFunction(const int& x) {// 在函数中不能修改 x 的值// 可以安全地使用 x
}

遍历容器:使用范围 for 循环遍历容器时,如果不需要修改容器的元素,可以使用常量引用来提高性能并确保容器不会被修改。

std::vector<int> numbers = {1, 2, 3, 4, 5};
for (const auto& num : numbers) {// 通过常量引用遍历容器,避免了不必要的复制,并确保容器不会被修改
}

返回值类型:在函数返回引用类型时,如果返回的对象是常量且不应该被修改,可以使用常量引用作为返回类型,以避免不必要的复制。

const std::string& getMessage() {static std::string message = "Hello, world!";return message; // 返回常量引用,避免了不必要的复制,并确保返回的对象不会被修改
}

总的来说,常量引用是一种有效的方式,用于提高性能、确保数据的不可修改性,并避免不必要的数据复制。对于确定不需要修改的对象,建议写成常量引用的形式。

指针与 const

指针与 const 主要包括以下内容:

  • pointer to const
  • const pointer
  • const pointer points to const

如果对这些内容已经了然于胸,完全可以跳过这一小节,如果有不清楚的地方,可以参考 【C/C++基础】指针与const。

const 修饰类成员函数

在自定义的数据类型(类)中,常常会发现某些成员函数的函数参数列表之后有 const 关键字,这样的成员函数被称为常量成员函数。

const 修饰类成员函数,其目的是防止成员函数修改被调用对象的值,如果我们不想修改一个调用对象的值,所有的成员函数都应当声明为 const 成员函数,这也是建议的写法。

参考

《C++ Primer 中文(第5版)》

写在最后

如果您发现文章有任何错误或者对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。

如果大家对 const 有更完整的整理或更清晰的认识,欢迎评论区交流。

最后,感谢您的阅读,如果有所收获的话可以给我点一个 👍 哦。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/812487.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自动化测试(selenium篇)

这次我们来介绍selenium 我们主要来讲解这几个要点 1.什么是自动化测试 2.什么是selenium 3.为什么来讲selenium 4.selenium的环境搭建 5.selenium的 API 1.什么是自动化测试 自动化测试指软件测试的自动化&#xff0c;在预设状态下运行应用程序或者系统&#xff0c;预设条…

蓝宝石衬底材料具有广阔消费市场 行业景气度良好

蓝宝石衬底材料具有广阔消费市场 行业景气度良好 衬底是由半导体单晶材料制造而成的晶圆片&#xff0c;既可以直接进入晶圆制造环节生产半导体器件&#xff0c;也可以进行外延工艺加工生产外延片&#xff0c;是电子元件的主体结构和支撑载体。蓝宝石衬底材料具有良好的透光性、…

burpsuite最新版2024.3.1安装

burpsuite最新版安装 环境 windows jdk22 BurpLoaderKeygen.jar burpsuite profression 2024.3.1 链接 链接&#xff1a;https://pan.baidu.com/s/1N6nggZZezg8y1FHpgwJmeg 提取码&#xff1a;n6uqjdk以及破戒方式这里不做介绍 注意事项 使用BurpLoaderKeygen.jar 破解之后…

Windows 2003 R2与Windows 2022建立域信任报错:本地安全机构无法跟域控制器获得RPC连接。请检查名称是否可以解析,服务器是否可用。

在Windows Server 2003 R2与Windows Server 2022之间建立域信任时遇到“本地安全机构无法与域控制器获得RPC连接”的错误&#xff0c;可能是由于以下几种原因&#xff1a; DNS 解析问题&#xff1a; 确保源域和目标域的DNS配置正确&#xff0c;能够互相解析对方的域名和IP地址。…

多语言婚恋交友APP开发流程一览

近年来&#xff0c;随着全球化的发展和人们对跨文化交流的需求增加&#xff0c;多语言婚恋交友APP的需求逐渐增长。开发这类APP需要考虑到不同语言和文化下用户的需求&#xff0c;涉及到一系列独特的流程和挑战。本文将从专家角度为您解析多语言婚恋交友APP的开发流程&#xff…

LeetCode105题:从前序与中序遍历构造二叉树(python3)

105题&#xff1a;从前序与中序遍历构造二叉树 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right right class Solution:def buildT…

PCB工艺规范及PCB设计安规原则

一、目的 规范产品的PCB工艺设计&#xff0c;规定PCB工艺设计的相关参数&#xff0c;使得PCB的设计满足可生产性、可测试性、安规、EMC、EMI等的技术规范要求&#xff0c;在产品设计过程中构建产品的工艺、技术、质量、成本优势。 二、适用范围 本规范适用于所有电了产品的PCB工…

【Redis】redis面试相关积累

Redis到底是多线程还是单线程&#xff1f; Redis 在设计上是单线程的&#xff0c;这意味着 Redis 服务器在任何给定时刻只能执行一个命令。然而&#xff0c;这并不意味着 Redis 无法利用多核 CPU&#xff0c;因为 Redis 使用了一些技术来提高性能和并发性&#xff0c;例如非阻…

【虚幻引擎】DTProjectSettings 蓝图获取基本项目配置插件使用说明 获取项目命名,项目版本,公司名,公司识别名,主页,联系方式

本插件可以使用蓝图获取到项目的一些基本配置&#xff0c;如获取&#xff1a;公司名、公司识别名、版权声明、描述、主页、许可条款、隐私政策、项目ID、项目命名、项目版本、支持联系方式、项目显示标题、项目调试标题信息、应保留窗口宽高比、使用无边框窗口、以VR启动、允许…

【Vue3进阶】- 第2学堂小商城项目后端准备和接口文档

简介 在大多数前端项目开发中&#xff0c;都需要与后端进行接口交互&#xff0c;后端通常会以文档的形式提供接口信息&#xff0c;前端开发者通过阅读这些文档&#xff0c;了解后端接口的功能和使用方法&#xff0c;从而实现数据的获取和提交等功能。 第二学堂小商城教程后端…

03攻防世界-unserialize3

根据题目可以看出&#xff0c;这是个反序列化的题目 打开网址观察题目可以看到这里是php的代码&#xff0c;那么也就是php的反序列化 本题需要利用反序列化字符串来进行解题&#xff0c;根据源码提示我们需要构造code。 序列化的意思是&#xff1a;是将变量转换为可保存或传输…

嵌入式之数据结构篇(五)

五、数据结构与算法 程序 数据结构 算法 1.数组 数组是存放在连续空间上的相同类型数据集合 数组下标是从0开始的数组内存空间地址是连续的 二分查找&#xff1a;给定一个n个元素升序的整型数组nums和一个目标值target&#xff0c;写一个函数搜索nums中的target&#xf…

vue2 的版本 使用 Ant Design Vue 1.78版本的组件库 做自定义接口 调用后端的接口上传excel文件

话不多说 上代码 <a-upload style"margin-left: 8px" :before-upload"beforeUpload" :showUploadList"false" :multiple"false" :headers"tokenHeader" ><a-button> <a-icon type"upload" /> 导…

MongoDB爬虫:(某扑)实战

https://bbs.hupu.com/bxj网页地址: https://bbs.hupu.com/bxj 然后我们在网页上定义帖子名称、帖子链接、创建时间、回复数、最后回复用户...... 除此之外,我们发现虎扑步行街最多显示的页数(20): 、 当我们打开第3页的时候,网页的URL的地址变为了:https://bbs.hupu.…

构建你的AI未来:CentOS 7上的dlib Docker魔法

前言 在当今信息爆炸的时代&#xff0c;人工智能&#xff08;AI&#xff09;已经成为了现代科技领域的中流砥柱。在众多 AI 库中&#xff0c;dlib 凭借其强大的功能和广泛的应用领域逐渐崭露头角。dlib 是一个高度灵活且功能丰富的机器学习库&#xff0c;旨在提供各种工具和算…

vmware虚拟机进不去系统补救

更新了虚拟机里面工具和资料&#xff0c;进行了磁盘整理和压缩&#xff0c;虚拟机运行进不去系统了。 网站找的修复方法均不可行。补救措施&#xff1a;利用DiskGenius.exe&#xff08;要用高版本不然复制的时候就知道了&#xff09; DG1342.rar - 蓝奏云 加载虚拟硬盘 2008x…

Rocky(Centos)数据库等高并发或高io应用linux系统调优,及硬件问题排查(含网络、磁盘、系统监控)

一、系统参数优化 默认的最大打开文件数是1024.不满足生产环境的要求。按照如下配置&#xff1a; 1、修改 systemctl管理的 servie 资源限制 编辑/etc/systemd/system.conf # 全局的打开文件数 DefaultLimitNOFILE2097152 # 全局打开进程数 DefaultLimitNPROC655352、调整系…

文章解读与仿真程序复现思路——电力系统自动化EI\CSCD\北大核心《基于分解算法与元学习结合的综合能源系统负荷预测》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

Vue.js组件精讲 第2章 基础:Vue.js组件的三个API:prop、event、slot

如果您已经对 Vue.js 组件的基础用法了如指掌&#xff0c;可以跳过本小节&#xff0c;不过当做复习稍读一下也无妨。 组件的构成 一个再复杂的组件&#xff0c;都是由三部分组成的&#xff1a;prop、event、slot&#xff0c;它们构成了 Vue.js 组件的 API。如果你开发的是一个…

科研学习|可视化——Origin绘制相关性系数矩阵

一、Origin软件版本 Origin2021版本 二、插件下载地址 CorrelationPlot.opx资源-CSDN文库 三、插件安装步骤 从上述链接下载插件将插件解压缩&#xff08;最好是解压缩到orgin的安装目录&#xff09;用origin打开插件&#xff08;或者打开origin&#xff0c;将插件拖拽到origin…