当前位置: 首页 > 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.xdnf.cn/news/1323703.html

相关文章:

  • Swift 实战:判断点集是否关于某条直线对称(LeetCode 356)
  • Effective C++ 条款48:认识模板元编程
  • 【前端面试题】JavaScript 核心知识点解析(第一题到第十三题)
  • 【Python语法基础学习笔记】条件表达式和逻辑表达式
  • 03.文件管理和操作命令
  • 网站服务器使用免费SSL证书安全吗?
  • 免费又强大的 PDF 编辑器 ——PDF XChange Editor
  • MacOS 安全机制与“文件已损坏”排查完整指南
  • 【Tech Arch】Spark为何成为大数据引擎之王
  • 算法题打卡力扣第26. 删除有序数组中的重复项(easy))
  • Linux 中断机制深度分析
  • 【轨物交流】轨物科技与华为鲲鹏生态深度合作 光伏清洁机器人解决方案获技术认证!
  • nuScence数据集
  • 特种行业许可证识别技术:通过图像处理、OCR和结构化提取,实现高效、准确的许可证核验与管理
  • Android Cutout(屏幕挖孔)详解
  • Python day48.
  • 【笔记ing】考试脑科学 脑科学中的高效记忆法
  • OCR库pytesseract安装保姆级教程
  • Zephyr下控制ESP32S3的GPIO口
  • 飞算JavaAI家庭记账系统:从收支记录到财务分析的全流程管理方案
  • 上下文切换及线程操作相关内容
  • 微信小程序通过uni.chooseLocation打开地图选择位置,相关设置及可能出现的问题
  • 开放最短路径优先协议
  • Python装饰器:从入门到精通
  • QNX 性能分析工具(hogs pidin tracelogger)
  • IOPaint 远程修图:cpolar 内网穿透服务实现跨设备图片编辑
  • Less (CSS 预处理器)
  • 贪心算法(Greedy Algorithm)详解
  • html页面打水印效果
  • 跨平台RTSP播放器深度对比:开源方案与商业SDK的取舍之道