<p>const关键字的核心作用是强制执行不变性,它通过承诺数据不可修改来提升代码安全性和可读性,并为编译器优化提供依据。其核心应用场景包括:声明常量变量(如const int max_attempts = 3;),区分指向常量的指针(const int ptr)与常量指针(int const ptr),以及定义不可修改对象状态的const成员函数(如int get_value() const)。在参数传递中,const引用避免拷贝并防止修改实参;返回const引用可阻止通过返回值修改原始数据。相比C语言的#define宏,const具有类型安全、作用域控制和可调试优势;而enum class适用于定义类型安全的枚举常量。最佳实践是优先使用const或constexpr替代#define定义常量,用enum class表示相关整型常量。const成员函数确保对const对象的只读访问,增强接口可靠性,配合mutable可在特定情况下允许内部状态变更而不影响外部可见性。在模板编程中,const推导遵循引用折叠规则:T&amp;amp;保留const属性,const T&amp;amp;amp;amp;amp;amp;剥离顶层const,通用引用T&amp;amp;&结合std::forward实现完美转发,精确保留参数的constness和左右值属性。正确掌握这些规则可避免性能损耗和语义错误,是编写高效、安全模板代码的基础。</p>

在C++中,
const
const
const
常量变量: 最直接的用法是声明一个不可修改的变量。
const int max_attempts = 3; // max_attempts的值不能被修改 // max_attempts = 4; // 编译错误
这里,
const
int
max_attempts
立即学习“C++免费学习笔记(深入)”;
常量指针与指向常量的指针: 这是初学者最容易混淆的地方。
pointer to const
const int value = 10; const int another_value = 20; const int* ptr = &value; // ptr指向一个常量int // *ptr = 15; // 编译错误:不能通过ptr修改value ptr = &another_value; // 合法:ptr可以指向另一个常量
我通常把这种理解为“承诺不通过这个指针去修改它指向的东西”。
const pointer
int data = 100; int* const const_ptr = &data; // const_ptr是一个常量指针 *const_ptr = 200; // 合法:通过const_ptr修改data的值 // const_ptr = &another_data; // 编译错误:const_ptr不能指向其他地方
这种情况下,是“指针的地址是固定的”。
const pointer to const
const int fixed_value = 50; const int* const fully_const_ptr = &fixed_value; // 指针和它指向的值都不能变 // *fully_const_ptr = 60; // 编译错误 // fully_const_ptr = &another_fixed_value; // 编译错误
const
mutable
class MyClass {
public:
int get_value() const { // const成员函数
// value_++; // 编译错误:不能修改成员变量
return value_;
}
void set_value(int v) {
value_ = v;
}
private:
int value_ = 0;
};
const MyClass obj;
// obj.set_value(10); // 编译错误:const对象不能调用非const成员函数
int v = obj.get_value(); // 合法:const对象可以调用const成员函数const
const
const
const
void print_data(const std::string& s) { // s是只读引用
// s[0] = 'A'; // 编译错误
std::cout << s << std::endl;
}const
const
const
const std::string& get_name() {
static std::string name = "Alice";
return name; // 返回一个常量引用
}
// get_name() = "Bob"; // 编译错误const
#define
enum
在我看来,
const
#define
enum
首先,
#define
#define PI 3.14159
PI
3.14159
#define SQUARE(x) x*x
SQUARE(a+b)
a+b*a+b
(a+b)*(a+b)
相比之下,
const
const
const
const
const
const
&
enum
enum class
enum
enum class
enum class
enum class
最佳实践:
我个人强烈建议,在C++中,凡是需要定义常量的地方,优先使用const
constexpr
enum class
#define
using
constexpr
const
const
它的核心思想很简单:一个
const
mutable
const
const
const
为什么它如此重要?
保证对象状态的完整性: 想象一下,你有一个
Point
x
y
distance()
Point
x
y
distance()
const
x
y
允许对const
const
const MyClass&
const
get_value()
const
const
const
const
const
class BankAccount {
public:
double get_balance() const { // 查询余额,不应修改账户
return balance_;
}
void deposit(double amount) { // 存款会修改余额
balance_ += amount;
}
private:
double balance_ = 0.0;
};
void process_account(const BankAccount& account) {
// account.deposit(100); // 编译错误:const对象不能调用非const成员函数
std::cout << "Current balance: " << account.get_balance() << std::endl; // 合法
}提高代码可读性和意图表达: 当其他程序员看到一个
const
编译器优化: 虽然这通常是次要的,但编译器知道
const
mutable
const
mutable
const
class DataProcessor {
public:
int get_processed_data() const {
if (!cache_valid_) {
// 假设这里执行耗时计算,并更新cache_
std::cout << "Calculating data..." << std::endl;
cached_data_ = 42; // 允许修改mutable成员
cache_valid_ = true; // 允许修改mutable成员
}
return cached_data_;
}
private:
mutable int cached_data_ = 0;
mutable bool cache_valid_ = false;
// int actual_data_; // 非mutable成员,不能在const函数中修改
};但我的建议是,
mutable
const
总而言之,
const
const
const
在C++模板编程中,
const
const
模板类型参数T
const
T
const
template<typename T>
void process_value(T val) {
// val是传入参数的拷贝,const属性被剥离
// 如果传入的是const int x,val的类型是int
}这里
val
模板类型参数T&amp;amp;
const
T&amp;amp;
T
const
template<typename T>
void process_ref(T&amp;amp; ref) {
// 如果传入的是int x,T推导为int,ref类型是int&amp;amp;
// 如果传入的是const int x,T推导为const int,ref类型是const int&amp;amp;
}这意味着你可以通过
ref
const
const
模板类型参数const T&amp;amp;amp;amp;amp;amp;
const
const T&amp;amp;amp;amp;amp;amp;
T
const
const
const T&amp;amp;amp;amp;amp;amp;
template<typename T>
void process_const_ref(const T&amp;amp;amp;amp;amp;amp; ref) {
// 无论传入int x还是const int x,T都推导为int
// ref的类型总是const int&amp;amp;
// ref是只读的
}这是处理任何类型(
const
const
const
通用引用(转发引用)T&amp;amp;&
T&amp;amp;&
int x
T
int&amp;amp;
T&amp;amp;&
int&amp;amp; &&
int&amp;amp;
int()
T
int
T&amp;amp;&
int&amp;amp;&
这意味着
T&amp;amp;&
const
std::forward
template<typename T>
void wrapper_func(T&amp;amp;& arg) { // arg是通用引用
// 假设我们想把arg完美转发给另一个函数
some_other_func(std::forward<T>(arg));
}
void some_other_func(int&amp;amp; x) { std::cout << "Lvalue ref: " << x << std::endl; }
void some_other_func(const int&amp;amp; x) { std::cout << "Const Lvalue ref: " << x << std::endl; }
void some_other_func(int&amp;amp;& x) { std::cout << "Rvalue ref: " << x << std::endl; }
// 使用:
int a = 10;
const int b = 20;
wrapper_func(a); // T推导为int&amp;amp;,arg是int&amp;amp;,转发后some_other_func(int&amp;amp;)
wrapper_func(b); // T推导为const int&amp;amp;,arg是const int&amp;amp;,转发后some_other_func(const int&amp;amp;)
wrapper_func(30); // T推导为int,arg是int&amp;amp;&,转发后some_other_func(int&amp;amp;&)std::forward<T>(arg)
T
int&amp;amp;
arg
T
int
arg
const
我的思考和建议: 在模板编程中,我发现理解
const
std::forward
const
const
const T&amp;amp;amp;amp;amp;amp;
T&amp;amp;
const
const
T&amp;amp;&
std::forward
忽略这些细微之处,很容易在模板代码中引入不必要的拷贝、丢失
const
const
以上就是如何在C++中正确使用const关键字_C++ const关键字用法全解的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号