一個例子徹底搞清楚拷貝構造函數和賦值運算符重載的區別!!!!


class TestChild
{
public:
    TestChild()
    {
        x=0;
        y=0;
        printf("TestChild: Constructor be called!\n");
    }
    ~TestChild(){}
    TestChild(const TestChild& tc)
    {
        x=tc.x;
        y=tc.y;
        printf("TestChild: Copy Constructor called!//因為寫在了Test(拷貝)構造函數的初始化列表里\n");
    }
    
    const TestChild& operator=(const TestChild& right)
    {
        x=right.x;
        y=right.y;
        printf("TestChild: Operator = be called! //因為寫在了Test(拷貝)構造函數的函數體里\n");
        return *this;
    }

    int x,y;
};

class Test
{
public:

    Test(){printf("Test:      Constructor be called!\n");}
    explicit Test(const TestChild& tcc)
    {
        tc=tcc;
    }
    ~Test(){}
    Test(const Test& test):tc(test.tc)
    {
        tc=test.tc;
        printf("Test:      Copy Constructor be called!\n");
    }

    const Test & operator=(const Test& right)
    {
        tc=right.tc;
        printf("Test:      Operator= be called!\n");
        return *this;
    }

    TestChild tc;
};

int main()
{
    printf("1、Test中包含一個TestChild,這兩個類分別具有構造函數、\n   拷貝構造函數、重載operator=。\n\n");
    printf("2、在調用Test的構造函數和拷貝構造函數之前,會根據跟在\n   這些函數后的初始化列表去初始化其\n   TestChild變量(調用TestChild的拷貝構造函數去初始化)\n\n");
    printf("3、一旦進入Test的構造函數體或拷貝構造函數體,則說明其成員變量TestChild已\n   經通過TestChild的構造函數或TestChild的拷貝構造函數構造出了對象\n");
    printf("   所以,在Test的構造函數體或拷貝構造函數體中,再去使用=號\n   給TestChild的時候,調用的就是TestChild的operator=,\n   而不是TestChild的拷貝構造函數了\n");
    printf("   這就是Test構造函數后面 “:” 初始化列表的存在意義!(\n   為了調用成員變量的構造函數或者拷貝構造函數)\n\n");
    printf("4、最后!揪出讓人困惑的終極原因!!!!!\n   Test test2=test1和Test test2(test1)這兩種是TM一模一樣的\n   (都調用拷貝構造函數)!!!!除了這點兒之外,其他地方都是該是什么是什么(\"()\"調用構造函數,\"=\"調用賦值操作符)!!!\n\n");
    printf("5、一個對象初始化完畢后,所有對這個對象的賦值都調用operator=\n\n輸出如下:");

    printf("Test test1; DO:\n");
    Test test1;
    printf("\n");
    printf("Test test2=test1; DO:\n");
    Test test2=test1;
    printf("\n");
    printf("Test test3(test2); DO:\n");
    Test test3(test2);
    printf("\n");
    printf("test3=test1; DO:\n");
    test3=test1;

     return 0;
}

 

     搞清楚這個之后我對C++真尼瑪是萬念俱灰。。C++這個女強人能學點兒C#小蘿莉小鳥依人的優點么!!!!!!!!!!!!!!

     嗯,其實C++的溫柔沒有被發現~ 她很貼心的發明了explicit這個關鍵字,如果把這個關鍵字加在構造函數之前,那么Test test2=test1;這樣的初始化或者隱式類型轉化是不能通過編譯的


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM