天天看點

匿名對象

#include <iostream> using namespace std; class Location{ public: Location(int xx = 0, int yy = 0){ X = xx; Y = yy; cout << "Constructor Object.\n"; } Location(const Location& obj){//copy構造函數 X = obj.X; Y = obj.Y; } ~Location(){ cout << X << "," << Y <<" "<< "Object destroyed." << endl; } int GetX(){ return X; } int GetY(){ return Y; } private: int X; int Y; }; //g()傳回一個元素 //結論1:函數的傳回值是一個元素(複雜類型),傳回的是一個新的匿名對象(是以會調用匿名對象類的copy構造函數) // //結論2:匿名對象的去和留 //如果用匿名對象初始化 另外一個同類型的對象,匿名對象轉成有名對象 //如果用匿名對象指派給 另外一個同類型的對象,匿名對象被析構 Location g(){ Location A(1, 2); return A;//A是一個局部變量,當生命周期完畢,會調用析構函數釋放空間。此時建立了一個匿名對象來接傳回值,是以會調用匿名對象類的複制構造函數,相當于A來初始化匿名對象 } void playobj01(){ cout << "playobj01執行開始\n" << endl; g();//匿名對象會被析構掉; printf("匿名對象會析構掉\n"); cout << "playobj01執行完畢\n" << endl; } void playobj02(){ cout << "playobj02執行開始\n" << endl; //用匿名對象初始化m 此時c++編譯器 直接把匿名對象轉成了m Location m = g(); printf("匿名對象被轉正,不會析構掉\n");//速度就會加快 cout << m.GetX() << endl; cout << "playobj02執行完畢\n" << endl; } void playobj03(){ cout << "playobj03執行開始\n" << endl; Location m2(1, 2); m2 = g(); printf("是以用匿名對象指派給m2,匿名對象被析構掉\n"); cout << m2.GetX() << endl; cout << "playobj03執行完畢\n" << endl; } int main() { playobj01(); playobj02(); playobj03(); system("pause"); return 0; }

上一篇: 匿名管道

繼續閱讀