C++ copy構造函數調用時機之匿名對象的介紹

#include <iostream>
#include <windows.h>
using namespace std;
//匿名對象
class NIMI
{
public:
	NIMI(int xx = 0, int yy = 0)		//	構造函數
	{
		X = xx; Y = yy;
		cout<<"構造函數"<<endl;
	}
	//copy構造函數,完成對象初始化
	NIMI(const NIMI &f)
	{
		X = f.X;
		Y = f.Y;
	}
	~NIMI()	//析構函數
	{
		cout << X << "," << Y << endl;
	}
	int getx() { return X; }
	int gety() { return Y; }
protected:
private:
	int X, Y;
};


//返回函數,返回一個元素
//結論1:函數的還回值是一個元素(複雜類型的),還回的一個新的匿名對象(所以會調用匿名對象的copy構造函數)
//結論2:匿名對象的去和留
//如果有匿名對象初始化另一個同類型的對象,匿名匿名對象直接轉成有名對象
//如果有匿名 賦值給另一個同類型的對象,則匿名對象被析構




//作用:
//當調用g()函數時,可直接調用匿名對象,使其變爲一個有名對象,不用再生產一個對象
//犧牲內存,縮減時間
NIMI g()
{
	NIMI A(1,2);	//創建一個對象A,調用構造函數
	return A;		//return A 用A創建了一個匿名對象,所以會調用匿名對象的copy 構造函數
					//還回後,將A匿名對象析構,調用析構函數
}


//搭建一個類的舞臺
void display()
{
	//用匿名對象初始化m ,C++編譯器直接把匿名對象轉成有名字對象 轉正
	//將匿名對象直接轉成m ,不再創建對象m
	NIMI m=g();	
	cout<<m.getx()<<endl;
}
//搭建一個類的舞臺
//匿名對象給另一個同名對象賦值
void display2()
{
	NIMI m2(3,4);
	cout<<m2.getx()<<endl;
	m2=g();
	cout<<m2.getx()<<endl;
}
int main()
{


	display2();
	system("pause");
	return 0;
}

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