匿名对象是一个很重要的话题 ,学习的时候可能会不太清楚什么时候产生匿名对象,并且匿名对象的生命周期也是一个很重要的话题。今天我们将带大家解决这个困难
#include<iostream>
using namespace std;
class Test
{
public:
Test() //无参数的构造函数 吴返回类型
{
m_a = 10;m_b = 20; //可以对成员完成初始化工作
cout << "无参数构造函数" << endl;
}
Test(int a, int b) //有2个我参数构造函数
{
m_a = a;m_b = b;
cout << "2参数构造函数" << endl;
}
Test(const Test&obj) //拷贝构造函数 完成对象初始化
{
cout << "拷贝构造函数" << endl;
m_b = obj.m_b + 100;m_a = obj.m_a + 100;
}
Test(int a) //一个参数拷贝构造函数
{
cout << "一个参数构造函数" << endl;
}
~Test()
{
cout << "我是析构函数" << endl;
}
void print() //测试函数
{
cout << "hahahha" << endl;
cout << "m_a=" << m_a << "m_b=" << m_b << endl;
}
int geta() { return m_a; } int getb() { return m_b; }
private:
int m_a;int m_b;
};
void f(Test p) //此时也会调用拷贝构造函数;
{
cout << "hahahha" << endl;
cout << "m_a=" << p.geta<< "m_b=" << p.getb << endl;
}
void play()
{
Test t1(1, 2);
Test t2 = t1;
cout << "对象初始化完毕" << endl;
f(t2); //将t2值传递,调用拷贝构造函数
} //调用两次拷贝构造函数,析构三次
Test g() //函数的返回值是一个元素(复杂类型) 调用匿名对象类的拷贝构造函数
{
Test a(1, 2); //先调用一个两个参数构造函数
return a; //此时返回的不是a a被析构了,他会再一次调用拷贝构造函数,生成一个匿名对象返回出去
}
void objplay()
{
g(); //生成了一个匿名对象
}
void objplay1()
{
Test m = g(); //注意 这不是用g()来初始化m 而是将匿名对象变成m 从匿名变成有名
Test n;
n = g(); //现在就是用g()来初始化n 匿名对象被析构
}
int main(void)
{
play();
objplay();
return 0;
}