#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; }
匿名对象
2023-11-05 16:55:22