C++核心成员函数深度解析
·
C++ 类和对象:默认成员函数详解
1. 构造函数
构造函数在对象创建时自动调用,用于初始化成员变量。基本特性:
- 与类名同名
- 无返回值类型
- 支持函数重载
类型分类:
- 默认构造函数:无参或所有参数有默认值
class Point { public: Point() : x(0), y(0) {} // 默认构造 private: int x, y; }; - 有参构造函数
Point(int a, int b) : x(a), y(b) {} - 初始化列表 优先于赋值语句,避免额外拷贝开销: $${效率 } \propto \frac{1}{\text{拷贝次数}}$$
2. 析构函数
对象销毁时自动调用,用于释放资源:
- 命名格式:${\sim}ClassName()$
- 无参数无返回值
- 禁止重载
示例:
class Buffer {
public:
Buffer(size_t sz) { ptr = new char[sz]; }
~Buffer() { delete[] ptr; } // 释放动态内存
private:
char* ptr;
};
3. 拷贝构造函数
用已有对象初始化新对象:
- 签名格式:$ClassName(const ClassName&)$
- 浅拷贝 vs 深拷贝
默认浅拷贝(逐成员复制)需改写为深拷贝处理指针:class String { public: String(const String& s) { len = s.len; data = new char[len]; // 深拷贝 memcpy(data, s.data, len); } private: char* data; size_t len; };
4. 拷贝赋值运算符
对象间赋值操作:
- 签名格式:$ClassName& operator=(const ClassName&)$
- 处理自赋值:$if(this \neq &rhs)$
标准实现:
String& operator=(const String& rhs) {
if (this != &rhs) {
delete[] data; // 释放旧资源
len = rhs.len;
data = new char[len]; // 深拷贝
memcpy(data, rhs.data, len);
}
return *this; // 支持链式赋值
}
5. 移动语义(C++11)
高效转移资源所有权:
移动构造函数:
String(String&& s) noexcept
: data(s.data), len(s.len) {
s.data = nullptr; // 置空防止双重释放
}
移动赋值运算符:
String& operator=(String&& rhs) noexcept {
if (this != &rhs) {
delete[] data;
data = rhs.data; // 资源转移
len = rhs.len;
rhs.data = nullptr;
}
return *this;
}
6. 其他特殊成员函数
- 取址运算符
Point* operator&() { return this; } - const取址运算符
const Point* operator&() const { return this; }
总结
默认成员函数核心关系图:
graph LR
A[构造函数] --> B[对象构造]
C[析构函数] --> D[资源释放]
E[拷贝构造/赋值] --> F[独立副本]
G[移动构造/赋值] --> H[资源转移]
改写原则:
- RAII(资源获取即初始化)
- Rule of Three/Five:需同时实现拷贝构造/拷贝赋值/析构函数(或扩展移动语义)
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)