C++返回对象与引用

C++返回对象与引用


其实,大家在写C++代码的时候,都会发现,有些函数的返回是引用,有些函数发的返回是对象,今天我们一起来做一下区分。


1.根源

返回对象和返回引用的最主要的区别就是函数原型和函数头

看一下例子:

Test  get(const Test&) //返回对象
Test& get(const Test&) //返回引用

2.操作性

这里的操作性指的是在返回的过程中,函数会进行哪些操作

  • 返回对象:返回对象调用了复制构造函数,所以在时间上面,返回对象的时间时间成本包括了复制构造函数来生成副本所需的时间和调用析构函数删除副本所需的时间 ,而返回对象其实是调用了程序的副本。直接返回对象与按值传递对象类似 ,都是临时的副本。

  • 返回引用:返回引用与按引用传递对象类似,调用和被调用的函数对同一个对象进行操作,所以不存在副本,从空间上,节省了空间;没有了拷贝构造函数的调用,从时间上,节省了时间成本。

    Test& Test::operator++()
    {
        ts++;
        return *this;
    }
    Test Test::operator++(int)
    {
        Test temp(tt);      //创建对象
        tt++;
        return Test;          //返回对象的副本
    }
    
    

3.返回的时机

所谓返回的时机,就是什么时候可以返回对象,什么时候可以返回引用。

  • 如果函数返回的是通过引用或指针传递给它的对象,则应当按引用返回对象 ,当按引用返回调用函数的对象或作为参数传递给函数的对象 ;如:Test& Test::operator++()
  • 如果函数返回在函数中创建的临时对象,则不要使用引用,如果先创建一个对象,然后返回改对象的副本,则可以使用返回对象 ;如:Test Test::operator++(int)

4.例子

  • 返回引用
#include <iostream>
using namespace std;

class Complex {
public:
	Complex(float x = 0, float y = 0) :_x(x), _y(y) {}
	void dis() {
		cout << "(" << _x << "," << _y << ")" << endl;
	}
	const Complex& operator+(const Complex &another);
private:
	float _x;
	float _y;
};
const Complex& Complex::operator+(const Complex & another) {
	return Complex(this->_x + another._x, this->_y + another._y);
}
int main()
{
	Complex c1(3, 3);
	Complex c2(4, 4);
	c1.dis();
	c2.dis();
	Complex c3 = c1 + c2;
	c3.dis();
	system("pause");
	return 0;
}

  • 返回对象
#include <iostream>
using namespace std;

class Complex {
public:
	Complex(float x = 0, float y = 0) :_x(x), _y(y) {}
	void dis() {
		cout << "(" << _x << "," << _y << ")" << endl;
	}
	const Complex operator+(const Complex &another);
private:
	float _x;
	float _y;
};
const Complex Complex::operator+(const Complex & another) {
	//return Complex(this->_x + another._x, this->_y + another._y);
	Complex com;
	com._x = this->_x + another._x;
	com._y = this->_y + another._y;
	return com;
}
int main()
{
	Complex c1(3, 3);
	Complex c2(4, 4);
	c1.dis();
	c2.dis();
	Complex c3 = c1 + c2;
	c3.dis();
	system("pause");
	return 0;
}


想了解学习更多C++后台服务器方面的知识,

请关注: 微信公众号:C++后台服务器开发

  • 4
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值