深入理解C++中的const成员
创作时间:
作者:
@小白创作中心
深入理解C++中的const成员
引用
CSDN
1.
https://blog.csdn.net/yishaobai/article/details/146000672
在C++编程中,const成员是类型系统的重要组成部分,尤其在类成员的设计中扮演关键角色。通过合理使用const成员,开发者可以显著提升代码的健壮性、可维护性和安全性。本文将深入探讨const成员函数、const成员变量的核心特性和应用场景。
1、const成员函数
1.1 基础语法
class A {
public:
void constFunc() const { // const成员函数
std::cout << "constFunc" << std::endl;
}
void nonConstFunc() { // 普通成员函数
std::cout << "nonConstFunc" << std::endl;
}
};
1.2 核心特性
- 不可变性保证:禁止修改类的非
mutable成员变量。 - 对象类型适配:
class A {
public:
void constFunc() const {
std::cout << "constFunc" << std::endl;
}
void nonConstFunc() {
std::cout << "nonConstFunc" << std::endl;
}
};
int main() {
const A a;
a.nonConstFunc(); // 编译错误,权限的放大
a.constFunc(); // 合法
return 0;
}
- 重载机制:
class Vector {
public:
Vector(int n = 5) {
a_ = new int[n];
size_ = 0;
capacity_ = n;
}
void PushBack(int val) {
if (size_ == capacity_) {
capacity_ *= 2;
int* tmp = new int[capacity_];
for (int i = 0; i < size_; i++) {
tmp[i] = a_[i];
}
delete[] a_;
a_ = tmp;
}
a_[size_] = val;
size_++;
}
int Size() const {
return size_;
}
~Vector() {
delete[] a_;
size_ = capacity_ = 0;
}
int& operator[](int index) {
return a_[index];
}
const int& operator[](int index) const {
return a_[index];
}
private:
int* a_;
int size_;
int capacity_;
};
void PrintVector(const Vector& vec) {
for (int i = 0; i < vec.Size(); ++i) {
std::cout << vec[i] << " "; // 匹配const的成员函数
}
std::cout << std::endl;
}
int main() {
Vector v;
v.PushBack(1);
v.PushBack(2);
v.PushBack(3);
v.PushBack(4);
v.PushBack(5);
v.PushBack(6);
PrintVector(v);
for (int i = 0; i < v.Size(); ++i) {
std::cout << ++v[i] << " "; // 匹配非const的成员函数
}
return 0;
}
1.3 典型应用场景
- 访问器方法(getter)。
- 数据完整性检查。
- 对象状态查询。
- 支持常量对象操作。
2、const成员变量
2.1 非静态const成员
class A {
public:
A()
: a_(1), b_(2) // 初始化列表
{}
private:
const int a_; // const成员变量必须在声明的时候初始化,因此必须采用初始化列表方式初始化或给缺省值。
int b_;
};
int main() {
A a;
return 0;
}
2.2 静态const成员
class A {
public:
A() {
b_ = 2;
}
private:
static const int a_; // 声明
int b_;
};
const int A::a_ = 1; // 定义
int main() {
A a;
return 0;
}
3、mutable成员变量
3.1 打破const限制
class Cache {
mutable std::mutex mtx; // 可变同步原语
mutable std::vector<int> cached; // 可变缓存
public:
void updateCache() const {
std::lock_guard<std::mutex> lock(mtx);
// 即使const函数也可修改cached
}
};
3.2 使用场景
- 线程同步原语。
- 缓存数据。
- 引用计数。
- 调试统计信息。
4、深入初始化规则
4.1 必须使用初始化列表的情况
成员类型 | 初始化方式 |
|---|---|
const成员 | 必须使用初始化列表 |
引用成员 | 必须使用初始化列表 |
无默认构造的对象 | 必须使用初始化列表 |
4.2 初始化顺序问题
class A {
public:
A(int x)
: b_(x), a_(b_)
{}
private:
int a_;
int b_;
};
int main() {
A a(3);
return 0;
}
- 由此可见,初始化顺序是按照声明的顺序决定的。
5、总结
合理运用const成员能够:
- 减少约30%的对象状态错误。
- 提升接口设计的清晰度。
- 增强多线程环境下的安全性。
- 帮助编译器生成更优化的代码。
热门推荐
电磁阀在气动系统中的应用十分普遍
长白山旅游攻略
Windows C盘空间高效清理终极指南:释放宝贵系统资源
超越乔丹?库里决胜时刻表现到底什么水平
租赁合同成本构成及签订注意事项
胆机or石机?HiFi界的“甜”与“咸”之争!
解密南昌“花花世界”背后的科技力量
投资商铺需要注意的事项有哪些?这些注意事项如何影响投资收益?
融资租赁合同期满后租赁物的归属的法律规定
提升自我价值感的六大秘诀:让你的人生更有意义
单元积分点应力如何外插至节点上 | 数值实现篇
交易如何设置止损点
周作人书信精选集:大牛爱读的文学瑰宝
从「阅后即焚」到「学以致用」:简谈 I.N.F.O 读书法
防静电鞋测量常见问题?
解构"草台班子"的世界
成人睡觉流口水是湿气重吗?
三国时期吴国的女性人物:从历史到传说
程序调试技巧:如何快速定位并解决代码中的常见问题?
浙江自驾游三天最适合路线及普陀山三日游攻略
繁星春水我的朋友为什么?
电池放电倍率
童鞋选购指南:如何为孩子选择一双合适的鞋子
晕轮效应和投射效应的区别
生命教育绘本《也许死亡就像毛毛虫变成蝴蝶》出版,为家长提供探讨死亡话题的示范
坐高铁不用买票!江苏多地已启用
浅谈千古诗圣爱国情
同类业绩应当如何进行理解?这种理解有哪些方面需要注意?
哈佛最新研究:50岁开始做到这5条,也能轻松延寿10年
《大侠立志传》全结局流程攻略:八个不同结局达成条件详解