强化训练2--匿名对象的生命周期


//临时对象和匿名对象没有人去接它,编译器马上就析构了

#include<iostream>
using namespace std;

class ABCD
{
public:
	ABCD(int a,int b,int c)
	{
		this->a = a;
		this->b = b;
		this->c = c;
		printf("ABCD() construct,a:%d,b:%d,c:%d \n",this->a,this->b,this->c);
	}
	~ABCD()
	{
		printf("~ABCD() construct,a:%d,b:%d,c:%d \n",this->a,this->b,this->c);
	}
	int getA()
	{
		return this->a;
	}
protected:
private:
	int a;
	int b;
	int c;
};

class MyE
{
public:
	MyE():abcd1(1,2,3),abcd2(4,5,6),m(100)
	{
		cout << "MyD()"<<endl;
	}
	~MyE()
	{
		cout << "~MyD()"<<endl;
	}
	MyE(const MyE &obj):abcd1(7,8,9),abcd2(10,11,12),m(100)
	{
		printf("MyD(const MyD & obj)\n");
	}
protected:
private:
	ABCD abcd1;//c++编译器不知道如何构造abcd1;先执行这个函数的构造函数
	ABCD abcd2;
	const int m;
};
int doThing(MyE mye1)
{
	//printf("doThing() mye1,abcd1,a:%d \n",mye1.abcd1.getA());//有问题一直通过不了
	printf("doThing() mye1,abcd1,a:%d \n");
	return 0;
}

int run3()
{
	printf("run3 star..\n");

	ABCD(400,500,600);//临时对象的生命周期,直接调用ABCD类的构造函数
	//临时对象和匿名对象没有人去接它,编译器马上就析构了
	printf("run3 end..\n");
	return 0;
}

int main()
{

	run3();

	system("pause");
	return 0;
}




匿名对象转正

#include<iostream>
using namespace std;

class ABCD
{
public:
	ABCD(int a,int b,int c)
	{
		this->a = a;
		this->b = b;
		this->c = c;
		printf("ABCD() construct,a:%d,b:%d,c:%d \n",this->a,this->b,this->c);
	}
	~ABCD()
	{
		printf("~ABCD() construct,a:%d,b:%d,c:%d \n",this->a,this->b,this->c);
	}
	int getA()
	{
		return this->a;
	}
protected:
private:
	int a;
	int b;
	int c;
};

class MyE
{
public:
	MyE():abcd1(1,2,3),abcd2(4,5,6),m(100)
	{
		cout << "MyD()"<<endl;
	}
	~MyE()
	{
		cout << "~MyD()"<<endl;
	}
	MyE(const MyE &obj):abcd1(7,8,9),abcd2(10,11,12),m(100)
	{
		printf("MyD(const MyD & obj)\n");
	}
protected:
private:
	ABCD abcd1;//c++编译器不知道如何构造abcd1;先执行这个函数的构造函数
	ABCD abcd2;
	const int m;
};
int doThing(MyE mye1)
{
	//printf("doThing() mye1,abcd1,a:%d \n",mye1.abcd1.getA());//有问题一直通过不了
	printf("doThing() mye1,abcd1,a:%d \n");
	return 0;
}

/*int run3()
{
	printf("run3 star..\n");
	//这个时候没有创建一个对象
	ABCD(400,500,600);//临时对象的生命周期,直接调用ABCD类的构造函数
	//临时对象和匿名对象没有人去接它,编译器马上就析构了
	printf("run3 end..\n");
	return 0;
}*/

int run3()
{
	printf("run3 star..\n");
	//这个时候创建一个对象
	ABCD abcd=ABCD(400,500,600);
	//有对象去接了
	printf("run3 end..\n");
	return 0;
}

int main()
{

	run3();

	system("pause");
	return 0;
}


发布了33 篇原创文章 · 获赞 2 · 访问量 8536

猜你喜欢

转载自blog.csdn.net/QQ960054653/article/details/55189972