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

C++中const的不同使用方法和意义

在 C++ 里,const 是一个用途广泛的关键字,它能用来修饰变量、函数参数、函数返回值以及成员函数等,在不同场景下含义不同,下面为你详细介绍:

1. 修饰常量

修饰普通变量

const 用于修饰普通变量时,该变量会成为常量,一旦初始化就不能再被修改。

#include <iostream>int main() {const int num = 10;// num = 20; // 错误,不能修改常量的值std::cout << "num: " << num << std::endl;return 0;
}
修饰指针

const 修饰指针时情况较为复杂,主要有以下几种:

常量指针(指向常量的指针)

指针指向的对象是常量,不能通过该指针修改所指向对象的值,但指针本身可以指向其他对象。

#include <iostream>int main() {int a = 10;int b = 20;const int* ptr = &a;// *ptr = 20; // 错误,不能通过指针修改所指向对象的值ptr = &b; // 指针本身可以指向其他对象std::cout << "*ptr: " << *ptr << std::endl;return 0;
}
指针常量

指针本身是常量,初始化后不能再指向其他对象,但可以通过该指针修改所指向对象的值。

#include <iostream>int main() {int a = 10;int b = 20;int* const ptr = &a;*ptr = 20; // 可以通过指针修改所指向对象的值// ptr = &b; // 错误,指针本身不能再指向其他对象std::cout << "*ptr: " << *ptr << std::endl;return 0;
}
指向常量的指针常量

指针本身和它所指向的对象都是常量,既不能通过指针修改所指向对象的值,指针也不能再指向其他对象。

#include <iostream>int main() {int a = 10;int b = 20;const int* const ptr = &a;// *ptr = 20; // 错误,不能通过指针修改所指向对象的值// ptr = &b; // 错误,指针本身不能再指向其他对象std::cout << "*ptr: " << *ptr << std::endl;return 0;
}

2. 修饰函数参数

传递常量引用

当函数参数为 const 引用时,函数内部不能修改该参数所引用的对象,常用于避免不必要的对象复制,同时保证数据的安全性。

#include <iostream>
#include <string>void printString(const std::string& str) {// str = "new string"; // 错误,不能修改引用的对象std::cout << "String: " << str << std::endl;
}int main() {std::string myString = "Hello";printString(myString);return 0;
}
传递常量指针

当函数参数为 const 指针时,函数内部不能通过该指针修改所指向的对象。

#include <iostream>void printValue(const int* ptr) {// *ptr = 20; // 错误,不能通过指针修改所指向对象的值std::cout << "*ptr: " << *ptr << std::endl;
}int main() {int num = 10;printValue(&num);return 0;
}

3. 修饰函数返回值

返回常量值

当函数返回值为 const 类型时,返回值是一个常量,不能被修改。

#include <iostream>const int getValue() {return 10;
}int main() {// getValue() = 20; // 错误,不能修改常量返回值std::cout << "Value: " << getValue() << std::endl;return 0;
}
返回常量引用

当函数返回常量引用时,返回的引用所指向的对象不能通过该引用被修改。

#include <iostream>
#include <vector>const int& getElement(const std::vector<int>& vec, size_t index) {return vec[index];
}int main() {std::vector<int> myVector = {1, 2, 3};// getElement(myVector, 0) = 10; // 错误,不能通过常量引用修改对象std::cout << "Element: " << getElement(myVector, 0) << std::endl;return 0;
}

4. 修饰类的成员函数

const 用于修饰类的成员函数时,该成员函数被称为常量成员函数,在常量成员函数内部不能修改类的非静态成员变量(mutable 修饰的变量除外)。

#include <iostream>class MyClass {
private:int value;
public:MyClass(int val) : value(val) {}int getValue() const {// value = 20; // 错误,不能在常量成员函数中修改非静态成员变量return value;}
};int main() {MyClass obj(10);std::cout << "Value: " << obj.getValue() << std::endl;return 0;
}

5. 修饰类的静态成员变量

静态成员变量必须在类外初始化,但当 const 用于修饰类的了整型和枚举类型的静态成员变量时,该静态成员变量成为常量,在类内进行初始化,并且初始化后不能再被修改。

#include <iostream>class MyClass {
public:static const int staticConstVar;
};// 类外初始化静态常量成员变量
const int MyClass::staticConstVar = 10;int main() {std::cout << "Static const variable: " << MyClass::staticConstVar << std::endl;return 0;
}

综上所述,const 关键字在不同的位置有不同的含义,主要体现在保证数据的常量性、避免不必要的修改以及提高代码的安全性和可读性等方面。

相关文章:

  • 初识Redis · 命令、数据结构补充、协议
  • 订阅应用 TikTok 广告实用指南
  • 电子电器架构 --- 下一代汽车电子/电气(E/E)架构
  • 长亭2月公开赛Web-ssrfme
  • 智能体数据分析
  • 【JAVA】基础知识“抽象类”详解,从入门到理解~
  • Redis Hash 介绍
  • HttpSessionListener 的用法笔记250417
  • Pikachu靶场-CSRF
  • DSO:牛津大学推出的物理一致性3D模型优化框架
  • ubuntu 查看现在服务使用的端口
  • 签到功能---实现签到接口
  • Unity基于屏幕空间的鼠标拖动,拖动物体旋转
  • 强化学习算法系列(五):最主流的算法框架——Actor-Critic算法框架
  • 论文阅读VACE: All-in-One Video Creation and Editing
  • 用Python Pandas高效操作数据库:从查询到写入的完整指南
  • 音视频相关协议和技术内容
  • 智能体开发的范式革命:Cangjie Magic全景解读与实践思考
  • 游戏盾和高防ip有什么区别
  • CSS进度条带斑马纹动画(有效果图)
  • 欧洲史上最严重停电事故敲响警钟:能源转型如何保证电网稳定?
  • 前4个月我国货物贸易进出口同比增长2.4%,增速较一季度加快1.1个百分点
  • 山寨“小米”智能马桶、花洒销售额过亿,被判赔3500万元
  • 中国中古史集刊高质量发展论坛暨《唐史论丛》创刊四十周年纪念会召开
  • 港理大研究揭示:塑胶废物潜藏微生物群落或引发生态危机
  • 上海加力提速推进优化营商环境,明确“十大攻坚突破任务”