C++ 中的 const 知识点详解,c++和c语言区别
目录
- 一。C++ 中的 const 知识点详解
- 1. 基本用法
- 1.1) 定义常量
- 1.2) 指针与 const
- 2. 函数中的 const
- 2.1)const 参数
- 2.2)const 成员函数
- 3. 类中的 const
- 3.1)const 成员变量
- 3.2)const 对象
- 4. const 返回值
- 5. constexpr (C++11 引入)
- 6. const 重载
- 7. mutable 关键字
- 8. const 引用与临时对象
- 9. const 转换
- 10. const 正确性的好处
- 常见面试题
- 二. C 语言中 const 的主要知识点
- 1. 基本用法
- 1.1)定义常量
- 1.2)指针与 const
- 2. 函数参数中的 const
- 3. const 返回值
- 4. 数组与 const
- 5. 结构体与 const
- 6. const 转换
- 7. const 正确性的好处
- 注意事项
- 示例代码
一。C++ 中的 const 知识点详解
C++ 中的 const 知识点详解
const 是 C++ 中一个重要的关键字,用于定义常量或指定不可修改的对象。以下是关于 const 的全面知识点总结:
1. 基本用法
1.1) 定义常量
const int MAX_VALUE = 100; // 常量,初始化后不可修改
// MAX_VALUE = 200; // 错误:不能修改常量
1.2) 指针与 const
const int* ptr1; // 指向常量对象的指针(指针指向的内容不可变)
int const* ptr2; // 同上
int* const ptr3; // 常量指针(指针本身不可变,但指向的内容可变)
const int* const ptr4; // 指向常量对象的常量指针(指针和内容都不可变)
2. 函数中的 const
2.1)const 参数
void print(const std::string& str) {// str 不能被修改std::cout << str << std::endl;
}
2.2)const 成员函数
class MyClass {
public:int getValue() const { // 常量成员函数,不能修改成员变量return value_;}void setValue(int v) { // 非常量成员函数value_ = v;}
private:int value_;
};
3. 类中的 const
3.1)const 成员变量
class MyClass {
public:MyClass(int v) : value_(v) {} // 必须在初始化列表中初始化
private:const int value_;
};
3.2)const 对象
const MyClass obj(10);
// obj.setValue(20); // 错误:不能调用非常量成员函数
int val = obj.getValue(); // 可以调用常量成员函数
4. const 返回值
const int* getPointer() {static int value = 42;return &value;
}
// 防止返回的指针被用于修改值
5. constexpr (C++11 引入)
constexpr int square(int x) {return x * x;
}
constexpr int size = square(10); // 编译时常量
6. const 重载
void process(int& val) { /* ... */ }
void process(const int& val) { /* ... */ }int getValue() const { // 常量成员函数,不能修改成员变量return value_;
}
void setValue() { // 非常量成员函数value_ = 10;
}
7. mutable 关键字
class MyClass {
public:void doSomething() const {count_++; // mutable 成员可以在常量对象中被修改}
private:mutable int count_ = 0;
};
8. const 引用与临时对象
const std::string& getString() {return "Hello"; // 绑定到临时对象是安全的
}
9. const 转换
void print(const std::string& s);std::string str = "test";
print(str); // 正确:非常量可以转为常量
print("test"); // 正确:字符串字面量转为 const char*
10. const 正确性的好处
提高代码安全性:防止意外修改
明确编程意图
允许函数接受常量和非常量参数
优化机会:编译器可能进行更好的优化
常见面试题
1.const int*, int const* 和 int* const 的区别?
2. 如何在常量成员函数中修改成员变量?mutable
3.为什么成员函数要有const 重载?
通过 const 重载,可以为一个类提供两种接口:一种用于修改对象,另一种用于只读访问。
4.const 和 constexpr 有什么区别?
const
表示“不可修改”,适用于运行时逻辑,防止意外修改对象或变量。
constexpr
表示“编译期常量”,适用于需要编译期优化的场景(如数组大小、模板参数),要求值必须在编译期确定。
二. C 语言中 const 的主要知识点
在 C 语言中,const 关键字用于定义常量或指定不可修改的对象。以下是关于 C 语言中 const 的主要知识点总结:
1. 基本用法
1.1)定义常量
const int MAX_VALUE = 100; // 常量,初始化后不可修改
// MAX_VALUE = 200; // 错误:不能修改常量
1.2)指针与 const
const int* ptr1; // 指向常量对象的指针(指针指向的内容不可变)
int const* ptr2; // 同上
int* const ptr3; // 常量指针(指针本身不可变,但指向的内容可变)
const int* const ptr4; // 指向常量对象的常量指针(指针和内容都不可变)
2. 函数参数中的 const
void print(const char* str) {// str 不能被修改printf("%s\n", str);
}
3. const 返回值
const int* getPointer() {static int value = 42;return &value;
}
// 防止返回的指针被用于修改值
4. 数组与 const
const int arr[] = {1, 2, 3}; // 常量数组,内容不可修改
// arr[0] = 4; // 错误:不能修改常量数组元素
5. 结构体与 const
5.1const 结构体成员
struct Point {const int x;const int y;
};
// 必须在初始化时赋值
struct Point p = {.x = 1, .y = 2};
5.2const 结构体变量
struct Point p = {1, 2};
const struct Point cp = p;
// cp.x = 3; // 错误:不能修改常量结构体成员
6. const 转换
void print(const char* s);char str[] = "test";
print(str); // 正确:非常量可以转为常量
print("test"); // 正确:字符串字面量转为 const char*
7. const 正确性的好处
提高代码安全性:防止意外修改
明确编程意图
允许函数接受常量和非常量参数
优化机会:编译器可能进行更好的优化
注意事项
- C 语言中的 const 变量默认具有外部链接性,除非显式声明为 static。
- 在 C 语言中,const 变量并不是真正的常量表达式,不能用于数组大小声明等需要常量表达式的场合。
- C 语言中的 const 变量可以通过指针间接修改(如果指针不是 const 限定的),这被认为是一个设计缺陷。
示例代码
#include <stdio.h>int main() {const int a = 10;// a = 20; // 错误:不能修改常量const int* ptr = &a;// *ptr = 30; // 错误:不能通过 ptr 修改 aint b = 20;int* const ptr2 = &b;*ptr2 = 30; // 正确:可以修改 b// ptr2 = &a; // 错误:不能修改 ptr2return 0;
}
相关文章:
C++ 中的 const 知识点详解,c++和c语言区别
目录 一。C 中的 const 知识点详解1. 基本用法1.1) 定义常量1.2) 指针与 const 2. 函数中的 const2.1)const 参数2.2)const 成员函数 3. 类中的 const3.1)const 成员变量3.2)const 对象 4. const 返回值5. …...

《PyTorch:开启深度学习新世界的魔法之门》
一、遇见 PyTorch:深度学习框架新星登场 在当今的技术领域中,深度学习已然成为推动人工智能发展的核心动力,而深度学习框架则是这场技术革命中的关键工具。在众多深度学习框架里,PyTorch 以其独特的魅力和强大的功能,迅速崛起并占据了重要的地位,吸引着无数开发者和研究者…...

分布式光纤传感(DAS)技术应用解析:从原理到落地场景
近年来,分布式光纤传感(Distributed Acoustic Sensing,DAS)技术正悄然改变着众多传统行业的感知方式。它将普通的通信光缆转化为一个长距离、连续分布的“听觉传感器”,对振动、声音等信号实现高精度、高灵敏度的监测。…...

Spring事务回滚在系统中的应用
以文章发布为例,介绍Spring事务回滚在系统中的应用 事务回滚的核心概念 事务回滚是数据库管理系统中的关键机制,它确保数据库操作要么全部成功,要么全部失败。在Spring框架中,我们可以通过Transactional注解轻松实现事务管理。 …...
.Net Framework 4/C# 属性和方法
一、属性的概述 属性是对实体特征的抽象,用于提供对类或对象的访问,C# 中的属性具有访问器,这些访问器指定在它们的值被读取或写入时需要执行的语句,因此属性提供了一种机制,用于把读取和写入对象的某些特征与一些操作…...

ASP.NET Core使用Quartz部署到IIS资源自动被回收解决方案
iis自动回收的原因 回收机制默认配置,间隔时间是1740分钟,意思是:默认情况下每1740分钟(29小时)回收一次,定期检查应用程序池中的工作进程,并终止那些已经存在很长时间或已经使用了太多资源的工作进程 进程模型默认配…...
Fullstack 面试复习笔记:Spring / Spring Boot / Spring Data / Security 整理
Fullstack 面试复习笔记:Spring / Spring Boot / Spring Data / Security 整理 之前的笔记: Fullstack 面试复习笔记:操作系统 / 网络 / HTTP / 设计模式梳理Fullstack 面试复习笔记:Java 基础语法 / 核心特性体系化总结Fullsta…...

调用.net DLL让CANoe自动识别串口号
1.前言 CANoe9.0用CAPL控制数控电源_canoe读取程控电源电流值-CSDN博客 之前做CAPL通过串口控制数控电源,存在一个缺点:更换电脑需要改串口号 CSDN上有类似的博客,不过要收费,本文根据VID和PID来自动获取串口号,代码…...
第5章:Cypher查询语言进阶
在掌握了Cypher的基础知识后,本章将深入探讨更高级的查询技术。这些进阶技能将帮助您构建更复杂、更高效的查询,解决实际业务中的复杂问题,并充分发挥Neo4j的图数据处理能力。 5.1 复杂查询构建 随着业务需求的复杂性增加,查询也…...
【Python进阶】元类编程
目录 🌟 前言🏗️ 技术背景与价值🩹 当前技术痛点🛠️ 解决方案概述👥 目标读者说明 🧠 一、技术原理剖析📊 核心概念图解💡 核心作用讲解🔧 关键技术模块说明⚖️ 技术选…...

算法(蓝桥杯学习C/C++版)
up: 溶金落梧桐 溶金落梧桐的个人空间-溶金落梧桐个人主页-哔哩哔哩视频 蓝桥杯三十天冲刺系列 BV18eQkY3EtP 网站: OI Wiki OI Wiki - OI Wiki 注意 比赛时,devc勾选c11(必看) 必须勾选c11一共有两个方法,任用…...

Docker镜像无法拉取问题解决办法
最近再学习RabbitMQ,需要从Docker镜像中拉取rabbitMQ,但是下拉失败 总的来说就是无法和docker镜像远程仓库建立连接 我又去尝试ping docker.io发现根本没有反应,还是无法连接找了许多办法还是没有办法解决,最后才发现是镜像问题&a…...

ZephyrOS 嵌入式开发Black Pill V1.2之Debug调试器
版本和环境信息如下: PC平台: Windows 11 专业版 Zephyr开发环境:v4.1.0 Windows 下搭建 Zephyr 开发环境 WeAct BlackPill V1.2开发板: WeAct STM32F411CEU6 BlackPill 核心板 Debug调试器: ST-LINK V2: ST-LINK V2 S…...
# 主流大语言模型安全性测试(二):英文越狱提示词下的表现与分析
主流大语言模型安全性测试(二):英文越狱提示词下的表现与分析 在上一篇文章中,我们对多个主流大语言模型(LLM)进行了中文诱导性提示词的越狱测试,评估其是否能够在面对非法、有害或危险内容请求…...
SAP 在 AI 与数据统一平台上的战略转向
在 2025 年 SAP Sapphire 大会上,SAP 展示了其最新的产品战略和技术整合方向,与以往不同的是,今年的讨论更加务实、聚焦客户实际需求。SAP 强调,ERP 的转型不再是“一刀切”或破坏性的,而是可以根据客户现状࿰…...

服务器磁盘空间被Docker容器日志占满处理方法
事发场景: 原本正常的服务停止运行了,查看时MQTT服务链接失败,查看对应的容器服务发现是EMQX镜像停止运行了,重启也是也报错无法正常运行,报错如下图: 报错日志中连续出现两个"no space left on devi…...

c++学习-this指针
1.基本概念 非静态成员函数都会默认传递this指针(静态成员函数属于类本身,不属于某个实例对象),方便访问对象对类成员变量和 成员函数。 2.基本使用 编译器实际处理类成员函数,this是第一个隐藏的参数,类…...

交易所系统攻坚:高并发撮合引擎与合规化金融架构设计
交易所系统攻坚:高并发撮合引擎与合规化金融架构设计 ——2025年数字资产交易平台的性能与合规双轮驱动 一、高并发撮合引擎:从微秒级延迟到百万TPS 核心架构设计 订单簿优化:数据结构创新:基于红黑树与链表混合存储,…...

OpenCV计算机视觉实战(10)——形态学操作详解
OpenCV计算机视觉实战(10)——形态学操作详解 0. 前言1. 腐蚀与膨胀1.1 为什么要做腐蚀与膨胀1.2 OpenCV 实现 2. 开运算与闭运算2.1 开运算与闭运算原理2.2 OpenCV 实现 3. 形态学梯度与骨架提取3.1 形态学梯度3.2 骨架提取 小结系列链接 0. 前言 形态…...
libiec61850 mms协议异步模式
之前项目中使用到libiec61850库,都是服务端开发。这次新的需求要接收服务端的遥测数据,这就涉及到客户端开发了。 客户端开发没搞过啊,挑战不少,但是人不就是通过战胜困难才成长的嘛。通过查看libiec61850的客户端API发现…...

[论文阅读] 人工智能 | 利用负信号蒸馏:用REDI框架提升LLM推理能力
【论文速读】利用负信号蒸馏:用REDI框架提升LLM推理能力 论文信息 arXiv:2505.24850 cs.LG cs.AI cs.CL Harnessing Negative Signals: Reinforcement Distillation from Teacher Data for LLM Reasoning Authors: Shuyao Xu, Cheng Peng, Jiangxuan Long, Weidi…...

基于 NXP + FPGA+Debian 高可靠性工业控制器解决方案
在工业系统开发中,**“稳定”**往往比“先进”更重要。设备一旦部署,生命周期动辄 5~10 年,系统重启或异常恢复成本高昂。 这时候,一套“值得托付”的软硬件组合,就显得尤为关键。 ✅ NXP —— 提供稳定、长期供货的工…...
CSS 选择器全解析:分组选择器/嵌套选择器,从基础到高级
一、CSS 选择器基础:从单个元素到多个元素 CSS 选择器是用来定位 HTML 元素的工具,就像 “元素的地址”。最基础的选择器有: 元素选择器(按标签名定位) css p { color: red; } /* 所有<p>标签 */ div { b…...
uniapp 对接腾讯云IM群公告功能
UniApp 实战:腾讯云IM群公告功能 一、前言 在即时通讯场景中,群公告是信息同步的重要渠道。本文将基于uniapp框架,结合腾讯云IM SDK,详细讲解如何实现群公告的发布、修改、历史记录查询等核心功能。 群公告的数据结构设计权限校…...

垂起固定翼无人机应用及技术分析
一、主要应用行业 1. 能源基础设施巡检 电力巡检:适用于超高压输电线路通道的快速巡查,实时回传数据提升智能运检效率。 油田管道监测:利用长航时特性(1.5-2小时)对大范围管道进行隐患排查,减少人力巡…...
Python Robot Framework【自动化测试框架】简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

vite配置@别名,以及如何让IDE智能提示路经
1.配置路径(vite.config.js) // vite.config.js import { defineConfig } from "vite"; import vue from "vitejs/plugin-vue"; import path from "path";// https://vite.dev/config/ export default defineConfig({server: {port: 8080,},plu…...
c#bitconverter操作,不同变量类型转byte数组
缘起:串口数据传输的基础是byte数组,write(buff,0,num)或者writeline(string),如果是字符串传输就是string变量就可以了,但是在modbus这类hex传递时,就要遇到转换了,拼凑byte数组时需要各种变量的值传递,解…...

【Linux】LInux下第一个程序:进度条
前言: 在前面的文章中我们学习了LInux的基础指令 【Linux】初见,基础指令-CSDN博客【Linux】初见,基础指令(续)-CSDN博客 学习了vim编辑器【Linux】vim编辑器_linux vim insert-CSDN博客 学习了gcc/g【Linux】编译器gc…...

RPA+AI:自动化办公机器人开发指南
RPAAI:自动化办公机器人开发指南 系统化学习人工智能网站(收藏):https://www.captainbed.cn/flu 文章目录 RPAAI:自动化办公机器人开发指南摘要引言技术融合路径1. 传感器层:多模态数据接入2. 决策层&…...