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

C++ const

在 C++ 中,const 是一个非常重要的关键字,用于声明常量或限制变量的修改权限,它可以提高代码的可读性、安全性和优化潜力。

1. 声明常量

const 可以将变量声明为常量,一旦初始化后就不能被修改。

const int MAX_SIZE = 100;  // 常量,必须初始化
MAX_SIZE = 200;  // 错误:不能修改 const 变量

常量必须在声明时初始化,且之后无法修改,编译器会检查并阻止任何修改尝试。

2. 修饰指针

const 与指针结合时,根据位置不同有不同含义:

  • const int* p:指针指向的内容是常量,不能通过指针修改内容,但指针本身可以指向其他地址。
  • int* const p:指针本身是常量,不能指向其他地址,但可以通过指针修改所指内容。
  • const int* const p:指针本身和指向的内容都是常量,均不可修改。
int a = 10, b = 20;const int* p1 = &a;
*p1 = 30;  // 错误:不能修改指向的内容
p1 = &b;   // 正确:指针可以指向其他地址int* const p2 = &a;
*p2 = 30;  // 正确:可以修改指向的内容
p2 = &b;   // 错误:指针不能指向其他地址const int* const p3 = &a;
*p3 = 30;  // 错误
p3 = &b;   // 错误

3. 修饰函数参数

const 修饰函数参数时,表示参数在函数内部不会被修改,提高安全性。

// 不能修改 str 的内容
void printString(const std::string& str) {str = "new";  // 错误:const 参数不可修改std::cout << str << std::endl;
}

对于自定义类型(如类对象),通常使用 const&(常量引用)传递参数,避免拷贝开销的同时防止修改。

4. 修饰函数返回值

const 修饰函数返回值时,限制返回值的修改权限。

// 返回常量整数,不能作为左值
const int getValue() {return 100;
}int main() {getValue() = 200;  // 错误:返回值是 const,不能赋值return 0;
}

对于返回指针的函数,const 可以限制不能通过返回的指针修改内容:

const int* getArray() {static int arr[] = {1, 2, 3};return arr;
}int main() {const int* p = getArray();*p = 10;  // 错误:不能修改返回的 const 内容return 0;
}

5. 修饰类的成员函数

在类中,const 放在成员函数的参数列表后,表示该函数不会修改类的任何成员变量(mutable 修饰的变量除外)。

class MyClass {
private:int value;
public:MyClass(int v) : value(v) {}// const 成员函数,不能修改成员变量int getValue() const {value = 100;  // 错误:不能修改成员变量return value;}// 非 const 成员函数,可以修改成员变量void setValue(int v) {value = v;}
};

const 成员函数可以被 const 对象调用,而非 const 成员函数不行:

const MyClass obj(5);
obj.getValue();  // 正确:const 对象可以调用 const 成员函数
obj.setValue(10); // 错误:const 对象不能调用非 const 成员函数

6. 修饰类的成员变量

const 修饰类的成员变量时,必须在构造函数的初始化列表中初始化,不能在函数体内赋值。

class MyClass {
private:const int MAX_VALUE;  // const 成员变量
public:// 必须在初始化列表中初始化MyClass(int max) : MAX_VALUE(max) {}
};

总结

const 的核心作用是保护数据不被意外修改,合理使用可以:

  • 避免程序中的逻辑错误(如误修改常量)。
  • 让编译器进行更严格的检查,提高代码安全性。
  • 帮助编译器进行优化,提升程序性能。

理解 const 的各种用法是掌握 C++ 的重要基础,尤其在指针和类的场景中需要特别注意其位置和含义。

http://www.lryc.cn/news/624219.html

相关文章:

  • CSDN转PDF【无水印且免费!!!】
  • 计算机网络:2、TCP和UDP
  • 代码随想录刷题Day36
  • 时序数据库 Apache IoTDB:从边缘到云端Apache IoTDB 全链路数据管理能力、部署流程与安全特性解读
  • RH134 管理网络安全知识点
  • 前端处理导出PDF。Vue导出pdf
  • 备份数据库数据的时候,使用全局锁会影响业务,那有什么其他方式可以避免?
  • Redis---持久化策略
  • 如何用企业微信AI 破解金融服务难题?
  • easyexcel fastexcel 官方文档 easyexcel合并单元格
  • linux:告别SSH断线烦恼,Screen命令核心使用指南
  • 前端上传excel并解析成json
  • 实现自学习系统,输入excel文件,能学习后进行相应回答
  • AI 对话高效输入指令攻略(五):AI+PicDoc文生图表工具:解锁高效图表创作新范式
  • 实战测试:多模态AI在文档解析、图表分析中的准确率对比
  • 2025年8月更新!Windows 7 旗舰版 (32位+64位 轻度优化+离线驱动)
  • 【温室气体数据集】全球总碳柱观测网络 TCCON
  • 基于NLP的文本生成系统设计与实现(LW+源码+讲解+部署)
  • 【硬件-笔试面试题】硬件/电子工程师,笔试面试题-59,(知识点:谐振电路,谐振频率,串联谐振,并联谐振)
  • 【WSL2笔记10】WSL-Ubuntu 环境下 ComfyUI 本地部署性能最大化指南
  • 【Mac】【Minecraft】关于如何在Mac上搭建基岩版MC服务器的方法
  • SIGKDD-2023《Complementary Classifier Induced Partial Label Learning》
  • 如何用github记录mit6s081-2020-labs学习过程
  • 【网络运维】Playbook项目实战:基于 Ansible Playbook 一键部署 LNMP 架构服务器
  • Tmux Xftp及Xshell的服务器使用方法
  • Tomcat Context的核心机制
  • 【GPT入门】第47课 LlamaFacotory 合并原模型与LoRA模型
  • Navicat 无法登录时找回 SQL 文件的方法
  • Zephyr 中的 bt_le_per_adv_set_data 函数的介绍和应用方法
  • RK3568 NPU RKNN(六):RKNPU2 SDK