匿名对象

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

posted @   薛定谔的小冰  阅读(67)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示