深入理解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%的对象状态错误。
- 提升接口设计的清晰度。
- 增强多线程环境下的安全性。
- 帮助编译器生成更优化的代码。
热门推荐
如何通过心得感悟提升自我成长?
网监管理局照片拍摄指南:从背景到光线的全方位详解
网监管理局照片拍摄指南:从背景到光线的全方位详解
选实木家具避免入坑,这些木质到底有什么区别?
武汉地铁24日迎来第100亿名乘客,深度解读:武汉地铁20年,这样圈粉过百亿
武汉地铁12号线:进度节点图更新,迎重大进展!
如何规划一周菜谱?避开 5 个误区轻松执行(含 Notion 模板)
指纹锁算法优化秘笈:提升识别准确度与响应速度的技巧
什么类型的车辆属于营运车?这种分类对车辆使用有何限制?
老年消费新趋势:从低龄到高龄,不同年龄段的银发经济洞察
大理美食排名前十,哪些最受欢迎?
月亮的象征意义与人类情感的深刻联系探讨
如何为尾部学生提供有效的支持与关怀?
张英《家书》:万里长城今犹在,不见当年秦始皇
泰迪犬(温顺可爱、适应能力强的泰迪犬在家庭生活中表现如何?)
项目形象管理办法有哪些
大学毕业成绩单有什么用
糖化血红蛋白多少可以确诊为糖尿病?
甘蔗怎么吃止咳化痰
潮州砂锅粥制作全攻略:从选材到配料,详解六款经典粥品
自闭症孩子上小学前需掌握的关键能力与适应策略
离职与辞职的法律后果是什么意思
如何解决Windows 11中桌面文件需要手动刷新才能显示的问题?
枪械工厂如何管理枪械
如何根据与沙发的距离选择电视机的尺寸?
现代汽车全固态电池试点生产线预计3月进入大规模生产 首车有望年底亮相
重庆铜梁白羊咸菜走出国门 乡村振兴产业焕新颜
镇人力资源社会保障所的主要职责是什么?
降水的四种类型!冷到滴水成冰!容易致灾的冻雨,到底是种什么“雨”?
加拿大大学电气工程专业详解:课程设置、研究机会与职业前景