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

C++面试3——const关键字的核心概念、典型场景和易错陷阱

const关键字的核心概念、典型场景和易错陷阱


一、const本质:类型系统的守护者

1. 与#define的本质差异
维度#defineconst
编译阶段预处理替换编译器类型检查
作用域无作用域(全局污染)遵循块作用域
调试可见性符号消失保留符号信息
类型安全无类型强类型约束
内存分配不占内存(文本替换)占用内存(可取地址)

致命陷阱示例:

#define MAX_SIZE 1024
const int max_size = 1024;char buffer1[MAX_SIZE*2];   // 正确,宏在编译前展开
char buffer2[max_size*2];   // C++11前错误,const变量不是编译期常量
2. constexpr的救赎(C++11)
constexpr int max_size = 1024;  // 真正的编译期常量
char buffer[max_size*2];        // 合法

二、类中的const攻防战

1. 成员变量:初始化列表的独裁
class Matrix {
public:Matrix(int w) : width(w) {} // 必须通过初始化列表
private:const int width;  // const成员变量mutable int cache; // 可变成员(即使const对象也可修改)
};

极端案例:

class Immortal {
public:Immortal() {}  // 错误!未初始化const成员year
private:const int year = 2023; // C++11允许类内初始化
};
2. 成员函数:const的双重含义
class DataPool {
public:void modify() const { // 错误!不能修改非mutable成员// count++;  }void nonConstFunc() { // 非const函数可修改成员}
};

重载的黑暗法则:

class Logger {
public:void log() const { /* 读操作 */ }void log() { /* 写操作 */ }
};const Logger cl;
cl.log();  // 调用const版本
Logger l;
l.log();   // 调用非const版本

三、指针与const的纠缠

1. 声明顺序的死亡游戏
int a = 10;
const int* p1 = &a;  // 指向常量的指针(底层const)
int const* p2 = &a;  // 等同p1
int* const p3 = &a;  // 常量指针(顶层const)
const int* const p4 = &a; // 双const

指针常量 vs 常量指针:

  • 左定值(const在*左边):指向的值不可变
  • 右定向(const在*右边):指针本身不可变
2. 类型转换的修罗场
const int* pci = &a;
int* pi = const_cast<int*>(pci);  // 去const化(危险!)
*pci = 20;  // 未定义行为(原始对象非常量时可能成功)

安全转换法则:

  • 只有原始对象本身是非const的,才能用const_cast去掉const属性

四、函数签名中的const暗战

1. 参数传递:效率与安全的博弈
void process(const BigObject& obj);  // 避免拷贝+防止修改
void dangerous(const int* ptr);      // 可能被const_cast突破防御
2. 返回值修饰:所有权的宣誓
const std::string& getConfig();  // 返回只读引用
const int* getRawData() const;   // 承诺不修改数据

死亡陷阱:

const int& func() {int local = 42;return local;  // 返回局部变量的引用!
}

五、高级战场:模板与const

1. 类型推导的混沌法则
template<typename T>
void deduce(T param) {}const int ci = 10;
deduce(ci);    // T推导为int(const被剥离)
deduce(&ci);   // T推导为const int*
2. const与完美转发
template<typename T>
void relay(T&& arg) {process(std::forward<T>(arg));
}relay(ci);  // 转发后保持const属性

六、面试核弹级问题

  1. 如何让const成员函数修改成员变量?

    • 使用mutable修饰成员变量
    • const_cast去除this指针的const属性(危险操作)
  2. const成员函数调用非const函数是否合法?

    class Test {
    public:void foo() { }void bar() const {foo();  // 错误!const函数不能调用非const成员函数}
    };
    
  3. 为什么函数重载时const可以作为区分?

    • 编译器将const成员函数视为void func(const T* this)
    • 非const版本为void func(T* this)

总结:const的哲学

  • 契约精神:对编译器承诺数据不可变
  • 防御性编程:限制意外修改,提升代码健壮性
  • 类型系统武器:与引用、模板等特性配合构建安全屏障

掌握const的每个细节,相当于拿到了C++类型系统的核按钮——既能保证代码安全,又能精准控制程序的每一块内存。

相关文章:

C++面试3——const关键字的核心概念、典型场景和易错陷阱

const关键字的核心概念、典型场景和易错陷阱 一、const本质&#xff1a;类型系统的守护者 1. 与#define的本质差异 维度#defineconst编译阶段预处理替换编译器类型检查作用域无作用域&#xff08;全局污染&#xff09;遵循块作用域调试可见性符号消失保留符号信息类型安全无类…...

超小多模态视觉语言模型MiniMind-V 训练

简述 MiniMind-V 是一个超适合初学者的项目&#xff0c;让你用普通电脑就能训一个能看图说话的 AI。训练过程就像教小孩&#xff1a;先准备好图文材料&#xff08;数据集&#xff09;&#xff0c;教它基础知识&#xff08;预训练&#xff09;&#xff0c;再教具体技能&#xf…...

深入理解仿函数(Functors):从概念到实践

文章目录 1. 什么是仿函数&#xff1f;2. 仿函数与普通函数的区别3. 标准库中的仿函数4. 仿函数的优势4.1 状态保持4.2 可定制性4.3 性能优势 5. 现代C中的仿函数5.1 Lambda表达式5.2 通用仿函数 6. 仿函数的高级应用&#xff08;使用C2020标准库及以上版本&#xff09;6.1 函数…...

第二届parloo杯的RSA_Quartic_Quandary

&#xff08;害&#xff0c;还是太菜了&#xff0c;上去秒了一道题之后就动不了了&#xff0c;今晚做个记录&#xff0c;一点点的往回拾起吧&#xff09; # from Crypto.Util.number import getPrime, bytes_to_long # import math # # FLAG b************** # # # def gene…...

团队氛围紧张,如何提升工作积极性?

当团队氛围长期处于紧张状态时&#xff0c;员工的积极性、创造力和凝聚力会显著下降。要有效提升工作积极性&#xff0c;应从建设心理安全环境、优化管理沟通方式、提升认可与激励机制、加强情感联结与归属感等方面系统改善。其中&#xff0c;建设心理安全环境是最重要的基础&a…...

vuex的基本使用

个人简介 &#x1f468;‍&#x1f4bb;‍个人主页&#xff1a; 魔术师 &#x1f4d6;学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全栈发展 &#x1f6b4;个人状态&#xff1a; 研发工程师&#xff0c;现效力于政务服务网事业 &#x1f1e8;&#x1f1f3;人生格言&…...

chrome因使用selenium无图模式导致不再加载图片问题解决

因为使用了selenium的无图模式访问chrome的本地用户数据导致正常使用chrome访问网页时图片不加载。现在页面出现验证码&#xff0c;验证码显示不了。 第一步&#xff1a;关闭所有chrome 第二步&#xff1a;找到Perferences文件 文件的目录为&#xff1a;C:\Users\用户名\AppDa…...

并发编程(5)

抛异常时会释放锁。 当线程在 synchronized 块内部抛出异常时&#xff0c;会自动释放对象锁。 public class ExceptionUnlockDemo {private static final Object lock new Object();public static void main(String[] args) {Thread t1 new Thread(() -> {synchronized …...

自己拥有一台服务器可以做哪些事情

上大学时候&#xff0c;买了自己的第一台服务器在HoRain Cloud上&#xff0c;结果没有好好利用&#xff0c;刚工作时候&#xff0c;又买了一台HoRain Cloud服务器&#xff0c;就想着好好利用。 可以搭建一些学习环境&#xff0c;比如说数据库&#xff0c;gitlab什么的 …...

Node.js聊天室开发:从零到上线的完整指南

为让你全面了解Node.js聊天室开发&#xff0c;我会先介绍开发背景与技术栈&#xff0c;再按搭建项目、实现核心功能、部署上线的流程展开&#xff0c;还会分享优化思路。 Node.js聊天室开发实战&#xff1a;从入门到上线 在即时通讯日益普及的今天&#xff0c;基于Node.js搭建…...

Unity 如何使用Timeline预览、播放特效

在使用unity制作和拟合动画时&#xff0c;我们常用到Timeline&#xff0c;前后拖动滑轨&#xff0c;预览动画正放倒放非常方便。如果我们想对特效也进行这个操作&#xff0c;可以使用下文的步骤。 至此&#xff0c;恭喜你又解锁了一个新的技巧。如果我的分享对你有帮助&#xf…...

实物工厂零件画图案例(下)

文章目录 总练习模块文章索引气动顶针轴直线轴承座法兰盘平皮带中空传动轴减速机V带轮减速机箱体 简介&#xff1a;点击此处可以下载该文章的案例模型&#xff0c;加上这篇文章总共有七篇文章是用来练习solidworks软件应用与建模思路的&#xff0c;大概有30多个案例模型&#x…...

esp32课设记录(五)整个项目开源github

我把该项目开源到了github&#xff1a;https://github.com/whyovo/ESP32_course_project 以下是readme文档&#xff1a; ESP32 课设 项目概述 这是一个基于ESP32的课设&#xff0c;实现了多种功能模式的集成&#xff0c;包括信息显示、图片展示、MQTT通信、摩尔斯电码处理以…...

力扣每日一题5-19

class Solution { public String triangleType(int[] nums) { Arrays.sort(nums); if (nums[0] nums[1] < nums[2]) return “none”; if (nums[0] nums[1] && nums[1] nums[2]) return “equilateral”; if (nums[0] nums[1] || nums[1] nums[2]) return “is…...

CI/CD 深度实践:灰度发布、监控体系与回滚机制详解

CI/CD 深度实践&#xff1a;灰度发布、监控体系与回滚机制详解 一、引言 在现代软件开发中&#xff0c;持续集成与持续交付&#xff08;CI/CD&#xff09;是加快交付速度、提升质量的关键。面对复杂的分布式系统和海量用户&#xff0c;如何安全、快速地发布新版本&#xff0c…...

【日常笔记】wps如何将值转换成东西南北等风向汉字

在WPS表格中&#xff0c;若要将数值&#xff08;如角度值&#xff09;转换成“东、南、西、北”等风向汉字&#xff0c;可通过以下步骤结合自定义函数或条件判断实现&#xff1a; 一、wps如何将值转换 方法一&#xff1a;使用LOOKUP函数&#xff08;简化公式&#xff09;&…...

RabbitMQ的简介

三个概念 生产者&#xff1a;生产消息的服务消息代理&#xff1a;消息中间件&#xff0c;如RabbitMQ消费者&#xff1a;获取使用消息的服务 消息队列到达消费者的两种形式 队列&#xff08;queue&#xff09;:点对点消息通信&#xff08;point-to-point&#xff09; 消息进入队…...

中职大数据实验室解决方案分享

第1部分概述 1.1政策背景 2021年3月&#xff0c;教育部印发《职业教育专业目录(2021年)》&#xff0c;共设置19个专业大类、97个专业类、1349个专业。新版《目录》聚焦推进数字化升级改造&#xff0c;构建未来技术技能&#xff0c;优化和加强了5G、人工智能、大数据、云计算、…...

阿里云web端直播(前端部分)

阿里云&#xff1a;Web播放器快速接入_视频点播(VOD)-阿里云帮助中心 import Aliplayer from aliyun-aliplayerimport aliyun-aliplayer/build/skins/default/aliplayer-min.css<div id"J_prismPlayer" style"width: 300px; height: 300px;" />var …...

从虚拟仿真到行业实训再到具身智能--华清远见嵌入式物联网人工智能全链路教学方案

2025年5月23-25日&#xff0c;第63届中国高等教育博览会&#xff08;高博会&#xff09;将在长春中铁东北亚国际博览中心举办。作为国内高等教育领域规模大、影响力广的综合性展会&#xff0c;高博会始终聚焦教育科技前沿&#xff0c;吸引全国高校管理者、一线教师、教育科技企…...

阿里云国际站与国内站:局势推进中的多维差异

在当今数字化浪潮席卷全球&#xff0c;云计算成为企业与开发者关键助力的局势下&#xff0c;阿里云作为行业翘楚&#xff0c;其国际站与国内站备受关注。两者虽同宗同源&#xff0c;却在诸多方面存在着显著差异&#xff0c;这些差异犹如隐藏在幕后的齿轮&#xff0c;悄然影响着…...

Docker项目部署深度解析:从基础命令到复杂项目部署

Docker项目部署深度解析&#xff1a;从基础命令到复杂项目部署 注&#xff1a;根据黑马程序员javawebAI视频课程总结&#xff1a; 视频地址 详细讲义地址 一、传统部署困境与Docker破局之道 在传统Linux部署场景中&#xff0c;新手常被三大难题困扰&#xff1a; 命令记忆负…...

reserve学习笔记(花指令)

这是闲来无事逛博客时看到的一篇相关文章&#xff0c;觉得挺有意思。 定义 首先花指令其实就是没有用的指令&#xff08;垃圾指令&#xff09;&#xff0c;它穿插在真正的代码中&#xff0c;会导致反编译时出现问题&#xff0c;从而会影响我们的静态分析 分类以及讲解 花指…...

docker运行Redis

创建目录 mkdir -p /home/jie/docker/redis/{conf,data,logs}添加权限 chmod -R 777 /home/jie/docker/redis创建配置文件 cat > /home/jie/docker/redis/conf/redis.conf << EOF # 基本配置 bind 0.0.0.0 protected-mode yes port 6379# 安全配置 密码是root require…...

Django 项目中,将所有数据表注册到 Django 后台管理系统

在 Django 项目中,将所有数据表注册到 Django 后台管理系统中需要为每个模型(Model)创建一个对应的 ModelAdmin 类,并在 admin.py 文件中注册这些模型。以下是一个详细的步骤指南: 确保你的模型已定义 首先,确保你已经在 models.py 文件中定义了所有的数据模型。例如:py…...

pyspark测试样例

from pyspark.sql import SparkSession from pyspark.sql.functions import col, lit, concat 创建 SparkSession spark SparkSession.builder.appName(“SparkSQLExample”).getOrCreate() 创建 DataFrame&#xff08;可以是从 CSV、JSON 等文件读取&#xff09; data […...

Python学习笔记--使用Django操作mysql

注意&#xff1a;本笔记基于python 3.12&#xff0c;不同版本命令会有些许差别&#xff01;&#xff01;&#xff01; Django 模型 Django 对各种数据库提供了很好的支持&#xff0c;包括&#xff1a;PostgreSQL、MySQL、SQLite、Oracle。 Django 为这些数据库提供了统一的调…...

HarmonyOS Next应用分层架构下组件封装开发实践

基于鸿蒙应用分层架构的ArkUI组件封装实践 在鸿蒙应用开发中&#xff0c;合理利用 ArkUI 组件进行封装&#xff0c;可以实现代码复用&#xff0c;提升开发效率。本文将结合鸿蒙应用分层架构的特点&#xff0c;详细探讨几个典型的 ArkUI 组件封装场景及其实现方案。 华为鸿蒙应…...

全能视频处理工具介绍说明

软件介绍 本文介绍的软件是FFmpeg小白助手&#xff0c;它是一款视频处理工具。 使用便捷性 这款FFmpeg小白助手无需安装&#xff0c;解压出来就能够直接投入使用。 主要功能概述 该工具主要具备格式转换、文件裁剪、文件压缩、文件合并这四大功能。 格式转换能力 软件支持…...

CSS实现过多的文本进行省略号显示

单行文本省略 .ellipsis {white-space: nowrap; /* 禁止换行 */overflow: hidden; /* 溢出内容隐藏 */text-overflow: ellipsis; /* 溢出部分显示为省略号 */width: 200px; /* 必须设置宽度 */ } 多行文本省略&#xff08;跨浏览器方案&#xff09…...

十三、Hive 行列转换

作者&#xff1a;IvanCodes 日期&#xff1a;2025年5月19日 专栏&#xff1a;Hive教程 在Hive中&#xff0c;数据的形态转换是数据清洗、分析和报表制作中的核心环节。行列转换尤为关键&#xff0c;它能将数据从一种组织形式变为另一种&#xff0c;以适应不同的业务洞察需求。本…...

Django之验证码功能

验证码功能 目录 1.绘制验证码 2.在登录页面里面实现验证码的功能 3.代码展示集合 这篇文章, 内容不是很多, 不过验证码, 是在网页里面比较常见的功能, 所有我们还是要掌握它&#xff01;&#xff01;&#xff01; 一、绘制验证码 绘制验证码, 我们需要用到图像, 然后在…...

代码随想录算法训练营 Day51 图论Ⅱ岛屿问题Ⅰ

图论 题目 99. 岛屿数量 使用 DFS 实现方法 判断岛屿方法 1. 遍历图&#xff0c;若遍历到了陆地 grid[i][j] 1 并且陆地没有被访问&#xff0c;在这个陆地的基础上进行 DFS 方法&#xff0c;或者是 BFS 方法 2. 对陆地进行 DFS 的时候时刻注意以访问的元素添加访问标记 //…...

Python Django 的 ORM 编程思想及使用步骤

目录 一、ORM 编程思想概述​ 二、Python 中使用 ORM 的主要优势​ 2.1 简化数据库操作​ 2.2 提高开发效率​ 2.3 减少错误​ 2.4 增强代码的可维护性​ 2.5 降低耦合性​ 三、Django 中使用 ORM 的详细步骤​ 3.1 创建应用模块​ 3.2 配置数据库信息​ 3.3 确定数…...

设计一个程序,将所有的小写字母转换为大写字母

汇编语言程序设计实验 实验内容 设计一个程序&#xff0c;将所有的小写字母转换为大写字母&#xff0c;此程序不能改变除字母a~z外的任何其它字符。 实验分析 实现的功能是将所有的小写字母转换为大写字母&#xff0c;此程序不能改变除字母a~z外的任何其它字符。可以分为以…...

Rust 学习笔记:关于错误处理的练习题

Rust 学习笔记&#xff1a;关于错误处理的练习题 Rust 学习笔记&#xff1a;关于错误处理的练习题想看到回溯&#xff0c;需要把哪个环境变量设置为 1&#xff1f;以下哪一项不是使用 panic 的好理由&#xff1f;以下哪一项最能描述为什么 File::open 返回的是 Result 而不是 O…...

使用docker——10分钟内 完成一个高可用的 MongoDB 副本集部署

实验目的 掌握 Docker 容器化部署 MongoDB 副本集 的方法 理解 主从同步、故障转移、数据一致性 等核心机制 熟悉 MongoDB 集群管理命令 和 运维监控技巧 &#x1f527; 实验环境 操作系统: Rocky Linux 9 / CentOS 7 软件依赖: Docker 20.10 docker-compose 1.29 硬件要…...

信息化的编程未来发展

信息化与数字化与编程领域与AI的爆炸发展是最近十几年瞠目结舌的事情&#xff0c;列举一下相关词汇&#xff1a; C#、AI、C、Python、.NET、API 、IDE、asp、JavaScript网页端、Visua Studio、VR、Github、OpenGL-webGL-计算机图形学、面向对象 、类库、GIS、GPU计算与显卡、可…...

计算机视觉与深度学习 | EMD-KPCA-LSTM、EMD-LSTM、LSTM回归预测对比,多输入单输出(Matlab完整程序和数据)

以下是针对EMD-KPCA-LSTM、EMD-LSTM和LSTM回归预测对比的完整可运行MATLAB实现。包含数据生成、特征处理、模型构建和性能评估全流程,并提供关键代码注释和注意事项。 完整代码实现(含数据生成) %% 清理环境 clear; clc; close all; warning off;%% 生成模拟数据(正弦波+噪…...

Ollama 如何在显存资源有限的情况下合理分配给不同的服务?

在显存资源有限的情况下&#xff0c;合理分配显存给不同服务需要结合硬件特性、软件配置和模型优化技术。以下是几种有效的方法&#xff1a; 1. 使用 Ollama 自身的资源限制参数 Ollama 提供了一些命令行参数来限制单个模型的资源使用&#xff1a; --ram&#xff1a;限制模型…...

2025-05-19 学习记录--Python-简易用户登录系统 + 计算天数

合抱之木&#xff0c;生于毫末&#xff1b;九层之台&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; 一、简易用户登录系统 ⭐️ # 用户登录系统 # 用户名、密码、黑名单 users [{name: 小红, password: 123, status:True},{name…...

APP小程序抓包和下游代理

本文仅作学习/技术记录和交流&#xff0c;请勿进行非法活动&#xff0c;否则后果自负&#xff01; 本文将主要围绕对小程序、APP的抓包方法&#xff0c;同时介绍下游代理。 在本文中我们将用到 Burpsuite、Yakit 和 Proxifier来完成。 小程序&APP抓包 对于小程序或APP抓…...

UE 材质几个输出向量节点

PixelNormalWS...

【八股战神篇】Java多线程高频面试题(JUC)

目录 专栏简介 一 如何创建线程&#xff1f; 延伸 1. 创建 Java 线程的本质 二 说说线程的生命周期&#xff1f; 延伸 1.描述一下线程的生命周期图 2.线程的优先级对线程执行有何影响&#xff1f; 3.如何确保三个线程按照特定顺序执行&#xff1f; 三 并发和并行的区…...

【esp32 mqtt】 连接亚马逊-加密传输信息

文章目录 1 加密文件1.1 服务端证书1.2 客户端CA证书1.3 客户端私钥1.4 三者协同工作的流程 2 亚马逊创建物品3 esp32 程序编写3.1 证书文件读取3.2 MQTT配置3.2.1 配置结构体3.2.2 初始化客户端3.2.3 注册事件3.2.4 开启mqtt3.2.5 示例 3.3 事件回调函数3.2.1 示例 3.4 接收到…...

用于判断主子关系的方法的实现(orm是efcore)

HasParentChildRelationship 方法&#xff1a;主要用于判断给定实体集合中是否存在主子关系&#xff0c;通过检查实体的导航属性来实现。CheckForDependencies 方法&#xff1a;是一个辅助方法&#xff0c;负责具体的依赖关系检查&#xff0c;包括对已访问实体的跟踪&#xff0…...

《Effective Python》第三章 循环和迭代器——在遍历参数时保持防御性

引言 本文基于《Effective Python: 125 Specific Ways to Write Better Python, 3rd Edition》一书的 Chapter 3: Loops and Iterators 中的 Item 21: Be Defensive when Iterating over Arguments。该条目深入探讨了在 Python 中处理迭代器&#xff08;iterator&#xff09;和…...

【python基础知识】Day30 模块和库的导入

学习python 学习python基础语法 处理任务需要用到的库 一、导入官方库的三种手段 1 标准导入&#xff1a;导入整个库 # 方式1&#xff1a;导入整个模块 import math# 导入库后&#xff0c;输出测试 print("方式1&#xff1a;使用 import math") print(f"圆周率…...

leetcode hot100刷题日记——4.盛最多水的容器

解答&#xff1a; 我的思路&#xff1a; class Solution{public:int maxArea(vector<int>& height){//遍历&#xff0c;我暴力找一下,时间超限// int vol0;// for(int i0;i<height.size()-1;i){// for(int ji1;j<height.size();j){// volmax(vol,…...

大二周周练翻译

翻译题 文章目录 翻译题[toc]中国茶道数字经济茶马古道中国父母现状电子商务长城大学生就业一带一路中国结 相遇的意义&#xff0c;是被你改变的那部分的我&#xff0c;代替你永远陪在我身边 点个赞呗&#xff01; 中国茶道 China is a country with a time-honored civilizat…...