大家好,我阿林又回来了。今天我分享的内容是c++相关的内容。是匿名函数的相关注意事项,希望能对大家的学习有一点帮助。
函数的返回值是一个元素(复杂类型的),返回的是一个新的匿名对象(所以会调用匿名对象类的拷贝构造函数)
匿名函数当返回值时如果没有人使用他就会结束自己的生命周期。如果有人使用则会到函数结束的时候结束生命周期。
下面我们用代码展示一下效果。
#include <iostream>
using namespace std;
class Location
{
public:
Location(int xx=0,int yy=0)
{
X = xx;
Y = yy;
cout << "construct Object" << endl;
}
//copy构造函数 完成对象的初始化
Location(const Location& obj)
{
X = obj.X;
Y = obj.Y;
}
~Location()
{
cout << X << ", " << Y << "Object destroyed." << endl;
}
public:
int GetX()
{
return X;
}
int GetY()
{
return Y;
}
private:
int X;
int Y;
};
//g函数 返回一个元素
//注意在这里返回的A并不是A的地址,而是通过A的拷贝函数创建的匿名对象,然后把A给析构了,因为返回的匿名函数的g()没有人去使用,所以的匿名函数的生命周期是在g()结束就开始析构函数
//结论1 :函数的返回值是一个元素(复杂类型的),返回的是一个新的匿名对象(所以会调用匿名对象类的拷贝构造函数)
//匿名对象的去留
Location g()
{
Location A(1, 2);
return A;
}
void objplay()
{
g();
}
void objplay2()
{
//用匿名对象初始化m 此时的c++编译器直接把匿名对转成m;(扶正)从匿名转成有名字了m
Location m = g();//第一种方法
//也会有第二种方法赋值
Location m2 = g();
m2 = g();//这个使用的就是等号,相当于拷贝函数赋值
printf("匿名对象,被扶正,不会析构掉");
cout << m.GetX() << endl;
}
int main()
{
objplay();
system("pause");
return 0;
}