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;

    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章