#includeusing 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;}