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;

    }

 

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