C++深copy和浅copy

这篇博客探讨了C++中类的构造函数、拷贝构造函数以及赋值运算符的使用。通过示例代码展示了如何实现深拷贝以避免内存泄漏,并解释了对象初始化和赋值操作的区别。此外,还指出了在不自定义拷贝构造函数时可能出现的问题。
#include <iostream>
using namespace std;

class Name {
public:
    Name(const char* pname) {
        size = strlen(pname);
        pName = (char*)malloc(size + 1);
        strcpy(pName, pname);
    }
    Name(const Name& obj) {
        // 用对象obj初始化自己
        pName = (char*)malloc(obj.size + 1);
        strcpy(pName, obj.pName);
        size = obj.size;
    }
    ~Name() {
        cout << "析构函数" << endl;
        if (pName != NULL) {
            free(pName);
            pName = NULL;
            size = 0;
        }
    }

    void operator=(Name& obj3) {
        cout << "operator=..." << endl;
        // 注意:
        // 在赋值pName之前,free释放内存,避免内存泄露
        if (pName != NULL) {
            free(pName);
            pName = NULL;
            size = 0;
        }

        // 用对象obj3来=号赋值自己
        pName = (char*)malloc(obj3.size + 1);
        strcpy(pName, obj3.pName);
        size = obj3.size;
    }
protected:
private:
    char* pName;
    int size;
};

// 对象的初始化和对象之间=号操作是两个不同的概念
void test() {
    Name obj1("obj1.....");
    // 创建并初始化(会调用copy构造函数)
    Name obj2 = obj1;  // 如果没有写copy构造函数是报错,应为c++编译器浅copy导致错误

    Name obj3("obj3...");
    //
    obj2 = obj3;  // =号赋值(没有调用copy构造函数),此处会报错,修复方法:重载=号操作符
    cout << "业务操作....." << endl;
}

void main() {

    test();

    system("pause");
}

Demo2

#include <iostream>
using namespace std;

class Test {
public:
    // 如果自定义了构造函数,那么编译器不会提供无参的构造函数
    Test(Test& obj) {
        cout << "我是copy构造函数" << endl;
        a = obj.a;
        b = obj.b;
    }
    Test(int _a, int _b) {
        a = _a;
        b = _b;
    }
protected:
private:
    int a;
    int b;
};
void main() {

    Test t1;
    //Test t2;
    //Test t3 = t2;
    system("pause");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值