C++类对象默认生成的8个成员函数

1. 无参构造函数

MyClass() {
    cout << "无参构造" << endl;
}

默认生成条件:不声明其他构造函数

2. 拷贝构造函数

MyClass(const MyClass& m) {
    this->a = m.a;
    cout << "拷贝构造" << endl;
}

默认生成条件:不声明拷贝构造或者移动构造

3. 移动构造函数(C++11)

MyClass(const MyClass &&m) {
    cout << "移动构造" << endl;
}

默认生成条件:不声明拷贝构造或者移动构造

4. 赋值运算符重载函数

MyClass& operator=(const MyClass& m) {
    if (this != &m) {
        this->a = m.a; 
    }
    cout << "赋值运算符" << endl;
    return *this;
}

默认生成条件:不声明赋值运算符重载函数或者移动赋值运算符重载函数

5. 移动赋值运算符重载函数(C++11)

MyClass& operator=(const MyClass&& m) {
    if (this != &m) {
        this->a = m.a; 
    }
    cout << "移动赋值运算符" << endl;
    return *this;
}

默认生成条件:不声明赋值运算符重载函数或者移动赋值运算符重载函数

6. 重载取址运算符函数

MyClass* operator&() {
    return this; 
}

7. 重载取址运算符const函数

const MyClass* operator&() const {
    return this;
}

8. 析构函数

~MyClass() {
    cout << "析构函数" << endl;
}

9. 测试

MyClass m1; // 1 无参构造
MyClass m2 = m1; // 2 拷贝构造
MyClass m3(m1); // 3 拷贝构造
m3 = m1; // 4 赋值运算符
MyClass m4 = std::move(m1);  // 5 移动构造
MyClass m5(std::move(m2)); // 6 移动构造,如果只声明了拷贝构造,会调用拷贝构造
m2 = std::move(m3); // 7 移动赋值运算符,如果只声明了赋值运算符重载函数,会调用赋值运算符重载函数

如果在定义的同时进行赋值(2和5),等价于用已有对象初始化新对象(3和6),则调用的是构造函数,如第2和第5调用的分别是拷贝构造和移动构造;如果在定义后,再进行赋值,则调用的是赋值运算符(4和7)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

it00zyq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值