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. 其他特殊成员函数
  1. 取址运算符
    Point* operator&() { return this; }
    

  2. const取址运算符
    const Point* operator&() const { return this; }
    

总结

默认成员函数核心关系图:

graph LR
    A[构造函数] --> B[对象构造]
    C[析构函数] --> D[资源释放]
    E[拷贝构造/赋值] --> F[独立副本]
    G[移动构造/赋值] --> H[资源转移]

改写原则:

  • RAII(资源获取即初始化)
  • Rule of Three/Five:需同时实现拷贝构造/拷贝赋值/析构函数(或扩展移动语义)
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐