C++ 函数参数传递与对象返回探究

1 函数参数对象值传递:

#include<iostream>
using namespace std;
class Demo
{
public:
	int x;
	Demo(int x)
	{
		this->x = x;
	}
};

Demo operator+(Demo a,Demo b)
{
	cout << "operator内a、b地址:" << &a << " " << &b << endl;
	Demo c(a.x + b.x);
	cout << "operator内c地址:" << &c << endl;
	return c;
}

int main()
{
	Demo a(1), b(2);
	cout << "main内a、b地址:" << &a << " " << &b << endl;
	cout << "main内c地址:" << &(a+b) << endl;
	system("pause");
	return 0;
}

在这里插入图片描述
可见对象传递过去会被拷贝。

2 函数参数对象引用传递

修改+号重载函数:

Demo operator+(Demo &a,Demo &b)
{
	cout << "operator内a、b地址:" << &a << " " << &b << endl;
	Demo c(a.x + b.x);
	cout << "operator内c地址:" << &c << endl;
	return c;
}

在这里插入图片描述
可见函数参数引用传递不需要拷贝新对象。

3 返回对象值

从上面结果可以看出,是拷贝,因为局部变量c出了函数域就会被销毁,因此在函数域外是函数域内的c的拷贝。

4 返回对象的引用

修改+号重载函数为:

Demo& operator+(Demo &a,Demo &b)
{
	cout << "operator内a、b地址:" << &a << " " << &b << endl;
	Demo c(a.x + b.x);
	cout << "operator内c地址:" << &c << endl;
	return c;
}

在这里插入图片描述
可以看出在+号重载函数与调用函数main内两个的c是同一个地址的,但是问题是回到main函数时,该地址的内存已经被销毁了,将main函数改为下面的形式进行验证:

int main()
{
	Demo a(1), b(2);
	cout << "main内a、b地址:" << &a << " " << &b << endl;
	Demo& c = a + b;
	cout << "main内c地址:" << &c << " 值:" << c.x << endl;
	system("pause");
	return 0;
}

在这里插入图片描述
结果可见,该内存并没有被销毁,不知道是不是VS的返回值优化“return value optimization"在起作用。

5 const作用

理想的重载函数应该为:

const Demo operator+(const Demo &a,const Demo &b)
{
	return Demo(a.x + b.x);//不出现局部/临时变量名c,给予编译器最大权限去优化
}

第一个const修饰函数是为了防止不符合使用习惯的下式出现:

( a + b) = c;

如果没有const修饰函数,a+b会返回一个Demo的临时/局部变量,可以再被c赋值,但是这不符合我们的使用习惯,而且给一个临时/局部变量赋值一般情况下也没有意义。
后面参数的两个const是为了防止调用函数改变引用的变量,即给予引用变量a、b只读属性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值