C++ =号和默认拷贝构造函数

 本文分析  等号在何时会调用默认拷贝构造函数,何时是复制。

    Name obj1("abcdefg");
    Name obj2 = obj1;  //此处不是赋值,会调用copy构造函数
    Name obj3("obj3");

    obj3 = obj1;  // 此处的=为复制obj1的数据,不调用copy构造函数

 也就是说当obj不存在的时候去=对象的时候就会调用构造函数。

当一个存在的对象去=的时候就为赋值,因为已经存在了嘛,所以不会调用构造函数

class  Name

{

public:

    Name(const char *myp)

    {

        m_len = strlen(myp);

        m_p =(char *) malloc(m_len + 1); 

        strcpy(m_p, myp);

    }


    //解决方案: 手工的编写拷贝构造函数 使用深copy

    Name(const Name& obj1)

    {

        m_len = obj1.m_len;

        m_p = (char *)malloc(m_len + 1);

        strcpy(m_p, obj1.m_p);

    }

    //obj3 = obj1;  // C++编译器提供的 等号操作 也属 浅拷贝

    //obj3.operator=(obj1)

    /*

    Name& operator=(Name &obj1) // 重载等号运算符

    {

        //先释放旧的内存

        if (this->m_p != NULL)

        {

            delete[] m_p;

            m_len = 0;

        }

        //2 根据obj1分配内存大小

        this->m_len = obj1.m_len;

        this->m_p = new char [m_len+1];

        

        //把obj1赋值

        strcpy(m_p, obj1.m_p);

        return *this;

    }

    */

    ~Name()

    {

        if (m_p != NULL)

        {

            free(m_p);

            m_p = NULL;

            m_len = 0;

        }

    }

protected:

private:

    char *m_p ;

    int m_len; 

};


//对象析构的时候 出现coredump

void objplaymain()

{

    int a=0;

    Name obj1("abcdefg");

    Name obj2 = obj1;  //C++编译器提供的 默认的copy构造函数  浅拷贝

    Name obj3("obj3");


    obj3 = obj1;  // C++编译器提供的 等号操作 也属 浅拷贝

    //obj3.operator=(obj1)

    //operato=(Name &obj1)

    //obj1 = obj2 = obj3;

    //obj2.operator=(obj3);

    //obj1 = void;

    a=4;

}

 int main()

    {

        char a=0;


       objplaymain();

       system("pause");

     //   a = cin.get();

        return 0;

    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值