当前位置: 首页 > news >正文

C/C++面试常见问题——const关键字的作用和用法

首先我们需要一下const关键字的定义,const名叫常量限定符当const修饰变量时,就是在告诉编译器该变量只可访问不可修改,而编译器对于被const修饰的变量有一个优化,编译器不会专门为其开辟空间,而是将变量名和数值作为一个kv键值对存入到符号表中。

注意:const修饰的变量必须要在定义时初始化

如上,当我们想要通过指针改变a时发现无法改变,这就是因为编译器对其的优化,导致a为存入符号表的一个固定值,而&a和b的地址一样只是编译器想让我们看到的,实际上是取地址时,编译器又开了一块空间存储a的值,并将这个空间地址给b。

 通过volatile关键字修饰变量我们可以告诉编译器,该变量无需优化

如上所示

 一,const常见用法

1.1 const修饰变量

const int a=10;
int const a=10;

const修饰变量如下,该变量无法直接修改,但是可以通过指针进行修改

1.2 const修饰指针

const修饰指针以*为界限分为常量指针、指针常量,也就是我们经常说的左定值,右定向

常量指针

const在*号左边,指针所指向的值无法改,但是可以改变指针的指向

指针常量

const在*号右边,指针所指向的值可以修改,但是无法更改指针的指向

以及两者共存的情况 ,无法修改指针指向的内容,也无法修改指针的指向

1.3 const修饰类成员变量

const修饰类成员变量,该变量必须要在初始化列表初始化,初始化之后该变量无法在更改,即使是构造函数也无法修改

class example
{
public:example(int a=10):_a(a){//_a = 11;//无法修改,会报错}
private:const int _a;
};

1.4 const修饰类成员函数

const修饰成员函数使用格式如下

class example
{
public:example(int a=10):_a(a){}void Example() const;
private:int _a;
};

实际上const修饰的是Example成员函数隐藏的*this指针,因此其实际修饰格式如下

class example
{
public:example(int a=10):_a(a){}//void Example() const;void Example(const example* this);
private:int _a;
};

因此当const修饰成员函数时,该函数对于对象的成员变量只能读取不能修改

1.5 const修饰函数返回值

const修饰函数返回值,则函数返回值被赋值对象必须也被const所修饰,通常返回值与引用搭配

const int& example();const int a=exampel();//正确
int a=example();//错误

二、const实战常用用法解析

2.1 const修饰函数输入式参数

const修饰输入式参数指的是,当我们函数的某个参数只希望函数内部读取而不能修改,就可以使用const进行修饰

 

例如上面所示,STL库中的strcmp函数,比较两个字符串是否相等,因此无需对其进行修改,为了保护参数就可以用const进行修饰

2.2 const修饰类成员函数

当类成员函数只需访问类成员变量,如打印成员变量之类,此时就可以用const修饰,防止误改成员变量

 

如上图STL中的vector容器,重载[]访问数组元素的接口,就有为了保证成员变量不被改变而const修饰成员函数的操作

2.3 const修饰函数返回值

 如上图所示,注意vector中重载[]的第二个接口的返回值const_reference,而该类型实质上是const value_type&,注意这个引用,后面要考。

首先当我们选择引用返回相比于正常返回,中间减少了数据拷贝——临时变量——数据拷贝的过程,有效提升了返回效率。而引用返回也有其弊端,如果用户修改这个返回值,那么就会直接影响容器中对应的值,如果我们不想让用户随意修改容器中的数据又想要高效的引用返回,那么就需要用const修饰返回值

相关文章:

C/C++面试常见问题——const关键字的作用和用法

首先我们需要一下const关键字的定义,const名叫常量限定符,当const修饰变量时,就是在告诉编译器该变量只可访问不可修改,而编译器对于被const修饰的变量有一个优化,编译器不会专门为其开辟空间,而是将变量名…...

Vue3.3指北(四)

Vue3.3指北 1、WebPack - VueCLI1.1、WebPack安装VueCli1.2、vue create 创建项目1.3、项目目录结构介绍 2、ViteVue32.1、认识create-vue2.2、使用create-vue创建项目2.3、项目目录剖析2.4、ESlint代码规范及手动修复2.5、通过eslint插件来实现自动修正 3、VueRouter43.1、单页…...

vue如何使用路由拦截器

在 Vue 中使用路由拦截器需要使用 Vue Router 提供的 beforeEach 方法。beforeEach 方法会在每个路由切换前,对路由进行拦截处理。可以在这个方法中进行一些验证或者权限认证,如果满足条件则继续跳转,否则取消跳转并进行相应处理。 下面是一…...

Docker 深度清除镜像缓存 (overlay2)

Docker 深度清除镜像缓存 (overlay2) 一般情况下,运维清理镜像是通过命令 docker rm i 删除镜像的。但是这条命令不会删除docker build命令产生的缓存文件。 这个时候需要使用 docker system 的系列命令来做相关处理。 docker system --hel…...

刷题笔记(第三天)

1.给定二进制字符串&#xff0c;将其换算成对应的十进制数字 输入&#xff1a;11000000 输出&#xff1a;192 function base10(str) {let sum 0;let a str.split().reverse(); // 个位是第一个元素for (var i 0; i < a.length; i) {suma[i]*Math.pow(2, i);}return sum;…...

Linux常用命令——chown命令

在线Linux命令查询工具 chown 用来变更文件或目录的拥有者或所属群组 补充说明 chown命令改变某个文件或目录的所有者和所属的组&#xff0c;该命令可以向某个用户授权&#xff0c;使该用户变成指定文件的所有者或者改变文件所属的组。用户可以是用户或者是用户D&#xff0…...

浅谈Docker原理

文章目录 前言命名空间控制组分层存储镜像和容器Docker EngineDocker Registry 前言 Docker 是一种容器化技术&#xff0c;它通过利用 Linux 内核提供的虚拟化技术和隔离机制&#xff0c;实现了更轻量级的应用程序虚拟化方案 命名空间 Docker 使用了 Linux 的命名空间特性&a…...

Rt-Thread 移植5--空闲线程和线程阻塞(KF32)

5.1原因 线程延时是浪费CPU资源&#xff0c;受否可以考虑延时的时候放弃CPU使用权&#xff0c;这样就充分利用了CPU的资源。 如果线程进入阻塞状态&#xff0c;没有其他线程运行&#xff0c;是否可以运行一个空闲线程来做一些内存的清理等系统工作呢&#xff1a;5.2 实现 5.2…...

Web3 治理实践探讨:如何寻找多元化发展路径?

Web3 领域变革正崭露头角&#xff0c;而社区治理开始成为行业热议话题。Web3 项目如何探寻多元化建设的解困路径&#xff0c;究竟是治理模型的精进成为首要问题&#xff0c;还是吸纳更多资金与组织教育培训&#xff0c;让开发者成为项目建设的中坚力量&#xff1f;本期 TinTinW…...

探索Vue 3和Vue 2的区别

目录 响应式系统 性能优化 Composition API TypeScript支持 总结 Vue.js是一款流行的JavaScript框架&#xff0c;用于构建用户界面。Vue 3是Vue.js的最新版本&#xff0c;相较于Vue 2引入了许多重大变化和改进。在本文中&#xff0c;我们将探索Vue 3和Vue 2之间的区别。 …...

中微爱芯74逻辑兼容替代TI/ON/NXP工规品质型号全

这里写自定义目录标题 工业级型号全产品线概述![在这里插入图片描述](https://img-blog.csdnimg.cn/097ef810b2234f07b0c0c1e962a73761.png)批量应用行业头部客户兼容替代封装对照逻辑参数对比电平转换系列型号对照HC/HCT 系列型号对照AHC/AHCT 系列型号对照LV/LVC 系列型号对照…...

聊一下Word2vec-训练优化篇

Word2vec 涉及到两种优化方式&#xff0c;一种是负采样&#xff0c;一种是层序Softmax 先谈一下负采样&#xff0c;以跳字模型为例。中心词生成背景词可以由两个相互独立事件的联合组成来近似&#xff08;引自李沐大神的讲解&#xff09;。 第一个事件是&#xff0c;中心词和…...

Julia元组、字典、集合

文章目录 元组字典集合共性 Julia系列&#xff1a;编程初步&#x1f525;数组 作为通用编程语言&#xff0c;除了数组之外&#xff0c;julia实现了元组、字典、集合等数据结构。 元组 与向量类似&#xff0c;也是一维的数据结构&#xff0c;并且对数据类型无要求&#xff0c…...

EfficientViT:高分辨率密集预测的多尺度线性关注

标题&#xff1a;EfficientViT: Multi-Scale Linear Attention for High-Resolution Dense Prediction 论文&#xff1a;https://arxiv.org/abs/2205.14756 中文版&#xff1a;【读点论文】EfficientViT: Enhanced Linear Attention for High-Resolution Low-Computation将soft…...

每日一道算法题:26. 删除有序数组中的重复项

难度 简单 题目 给你一个 非严格递增排列 的数组 nums &#xff0c;请你原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯一元素的数量为…...

吴恩达《机器学习》2-2->2-4:代价函数

一、代价函数的概念 代价函数是在监督学习中用于评估模型的性能和帮助选择最佳模型参数的重要工具。它表示了模型的预测输出与实际目标值之间的差距&#xff0c;即建模误差。代价函数的目标是找到使建模误差最小化的模型参数。 二、代价函数的理解 训练集数据&#xff1a;假设我…...

软考 系统架构设计师系列知识点之设计模式(6)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之设计模式&#xff08;5&#xff09; 所属章节&#xff1a; 老版&#xff08;第一版&#xff09;教材 第7章. 设计模式 第2节. 设计模式实例 相关试题 1. 设计模式描述了一个出现在特定设计语境中的设计再现问题&…...

use renv with this project create a git repository

目录 1-create a git repository 2-Use renv with this project 今天在使用Rstudio过程中&#xff0c;发现有下面两个新选项&#xff08;1&#xff09;create a git repository (2) Use renv with this project. 选中这两个选项后&#xff0c;创建新项目&#xff0c;在项目目…...

摄像头种类繁多,需要各自APP

老外报怨吾APP不能用之后&#xff0c;吾按照提供的图片买了一个。昨天到货以后&#xff0c;心想这下你小子可被我逮住了&#xff0c;非解决你不可…… 吾APP当然不能用。老外声称能用的APP也不能用。又下载了一个&#xff0c;还是不能用。 最后只能老老实实的想办法从Google P…...

Openssl数据安全传输平台010:jasoncpp 0.10.7的编译 - Windows-vs2022 / Ubuntu/ Centos8 -含测试代码

文章目录 0. 代码仓库1 安装1.1 windows 下的安装1.2 Linux 下的安装1.2.1 相关环境配置问题1.2.2 准备安装1.2.2.1 安装scons1.2.2.2 安装jsoncppUbuntu系统下Centos8系统下 2 编译 c 测试文件&#xff1a; json-test.cpp2.1 配置库文件2.2 配置VS2.3 Winsows系统下cpp文件测试…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...