天天看點

C++拷貝構造函數的調用時機測試

備注:有些代碼注釋掉了,因為不能同時運作多個main函數。如果測試打開即可,後面有注釋,多看看

#include "iostream"

using namespace std;

class Test4

{

private:

    int m_a;

    int m_b;

public:

    Test4()

    {

        m_a=0;

        m_b=0;

        cout<<"無參構造函數"<<endl;

    }

    Test4(int a,int b)//有參數構造函數

    {

        m_a = a;

        m_b = b;

        cout<<"有參數構造函數"<<endl;

    }

    Test4(const Test4& obj){

        cout<<"我也是構造函數"<<endl;

    }

    Test4(int a){

        m_a = a;

        m_b = 0;

        cout<<"一個參數構造函數"<<endl;

    }

};

class Location

{

public:

    Location(int xx=0,int yy=0)

    {

        X = xx; Y = yy; cout<<"Constructor Object.\n";

    }

    //完成對象的初始化

    Location(const Location & obj)//拷貝構造函數

    {

        X = obj.X; Y = obj.Y;

    }

    ~Location()

    {

        cout<<X<<","<<Y<<"Object destroyed."<<endl;

    }

    int getX(){return X;}

    int getY(){return Y;}

private:

    int X,Y;

};

//業務函數 形參是一個元素

void f(Location p)

{

    cout<<p.getX()<<endl;

}

//g函數傳回一個元素

//結論:函數的傳回值是一個元素(複雜類型),傳回的是一個新的匿名對象(是以會調用匿名對象類的拷貝構造函數)

//匿名對象的去和留

//如果用匿名對象初始化另外一個同類型對象,那麼匿名對象直接轉成有名對象。

//如果用匿名對象指派給另外一個同類型的對象,那麼匿名對象被析構。

Location g()

{

    Location A(1,2);

    return A;

}

//指派構造函數(拷貝構造函數)用一個對象去初始化另外一個對象。

//第二種調用方法

//第三種調用方法

//拷貝構造函數的第四種應用場景

void objplay2()

{

    g();

}

void objplay3()

{

    //用匿名對象初始化m,此時c++編譯器直接把匿名對象轉成m;從匿名轉換成有名字m。

    Location m = g();

    cout<<m.getX()<<endl;

}

void main()

{

    objplay3();

    system("pause");

}