关于匿名对象的说明

匿名对象即没有名字的对象,一般用于函数返回值.对于匿名对象的特性,以下是详细代码介绍和总结.

 

//示例代码
#include<iostream>
using namespace std;
class A
{
private:
	int x;
public:
	A(int x):x(x) { cout << "调用有参构造" << endl; }
	A(const A&other) :x(other.x) { cout << "调用拷贝构造" << endl; }
	~A(){cout<<"调用析构函数"<<endl;}
};
int main()
{
	A(0);//匿名对象 没有名字  调用构造之后立刻执行析构
	cout << "我是分割线" << endl;
	
	getchar();
	return 0;
}

代码运行效果:

 

一般的匿名对象在创建之后立刻调用析构.不过也有例外.

现将上述代码的第15行改成如下语句

新的运行结果如下

 如果有一个对象需要用这个匿名对象实例化,那么就不再是用这个匿名对象去拷贝一个新的对象出来,然后直接析构这个匿名对象,而是直接让这个匿名对象转变成a.(函数中返回值中的匿名对象也是如此)

 下面分别使用匿名和普通临时对象重载了加法和减法

 

//示例代码
#include<iostream>
using namespace std;
class A
{
private:
	int x;
public:
	A(int x):x(x) { cout << "调用有参构造" << endl; }
	A(const A&other) :x(other.x) { cout << "调用拷贝构造" << endl; }
	~A(){cout<<"调用析构函数"<<endl;}
	friend A operator+(const A& a, const A&b)//重载+运算符
	{
		return A(a.x + b.x);//返回匿名对象
	}
	friend A operator-(const A&a, const A&b)//重载-运算符
	{
		A temp(a.x+b.x);
		return temp;//返回普通对象
	}
};
int main()
{
 A other(5), another(2);//先定义两个普通的变量
 cout << "=======以下执行加法======" << endl;
 A a = other + another;
 cout << "=======以下执行减法======" << endl;
 A b = other - another;


 getchar();
 return 0;
} A other(5), another(2);//先定义两个普通的变量
 cout << "=======以下执行加法======" << endl;
 A a = other + another;
 cout << "=======以下执行减法======" << endl;
 A b = other - another;


 getchar();
 return 0;
}

 

运行结果如下

以上代码结果分析:

 执行加法的时候,创建了匿名对象(调用一次构造),外面有a需要实例化,因此匿名对象直接转换成a(不在调用构造)

 执行减法的时候,创建了临时对象temp(调用构造函数),然后外面有b需要实例化,于是调用了拷贝构造函数(隐性调用),之后temp的生命周期结束,调用析构函数

 

 

 

总结:1.一般匿名对象调用构造之后立刻调用析构,生命周期很短.

        2.如果遇到有外部对象需要实例化,那么匿名对象直接转换成外部对象

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值