关于C++函数思考2(C++函数返回引用和返回非引用的区别)

本文通过实例探讨了C++中函数返回引用与非引用的区别,分析了不同情况下这两种方式对程序效率的影响,并总结了在实际编程中如何选择合适的返回方式。

      引用是提高代码效率的一大利器,尤其对于对象来说,当引用作为参数时候不用大面积的复制对象本身所造成的空间与时间的浪费。所以有时候对于参数的返回值我们也希望返回参数的引用。在这里我们回忆一下C语言函数返回局部变量所注意的方面,也可以看我的这篇文章。下来我们对于C++ 中函数返回引用或非引用进行探讨!!

1.返回引用


/**********************************************************************    
* *   Copyright (c)2015,WK Studios  
* *   Filename:  A.h
* *   Compiler: GCC  vc 6.0   
* *   Author:WK    
* *   Time: 2015 4 5  
* **********************************************************************/
#include<iostream>

using std::cout;
using std::cin;
class Test
{
public:
	Test(int d=0):m_data(d)
	{
		cout<<"Create Test Obj :"<<this<<"\n";
	}
	Test(const Test &t)//提一句 对于拷贝构造函数不能进行对象值传递,因为在值传递的时候会调用拷贝构造,就会一直调用,无限循环
	{
		cout<<"Copy Test Obj : "<<this<<"\n";
		m_data = t.m_data;
	}
	Test& operator=(const Test &t)
	{
		cout<<"Assgin:"<<this<<" : "<<&t<<"\n";
		if(this != &t)
		{
			m_data = t.m_data;
		}
		return *this;
	}
	~Test()
	{
		cout<<"Free Test Obj :"<<this<<"\n";
	}
	int GetData()const
	{
		return m_data;
	}
	void print()
	{
		cout<<m_data<<"\n";
	}
private:
	int m_data;
};
//方式一
Test& fun(const Test &t)
{
	int value = t.GetData();
	Test tmp(value);
	return tmp;
}

void main()
{
	Test t(10);
	
	Test t1;
	t1 = fun(t);
	cout<<"m_data of t1 is: ";
	t1.print();
	
	Test t2 = fun(t);
	cout<<"m_data of t2 is: ";
	t2.print();
}



2.返回非引用

<span style="color:#333333;">/**********************************************************************    
* *   Copyright (c)2015,WK Studios  
* *   Filename:  A.h
* *   Compiler: GCC  vc 6.0   
* *   Author:WK    
* *   Time: 2015 4 5  
* **********************************************************************/
#include<iostream>

using std::cout;
using std::cin;
class Test
{
public:
	Test(int d=0):m_data(d)
	{
		cout<<"Create Test Obj :"<<this<<"\n";
	}
	Test(const Test &t)
	{
		cout<<"Copy Test Obj : "<<this<<"\n";
		m_data = t.m_data;
	}
	Test& operator=(const Test &t)
	{
		cout<<"Assgin:"<<this<<" : "<<&t<<"\n";
		if(this != &t)
		{
			m_data = t.m_data;
		}
		return *this;
	}
	~Test()
	{
		cout<<"Free Test Obj :"<<this<<"\n";
	}
	int GetData()const
	{
		return m_data;
	}
	void print()
	{
		cout<<m_data<<"\n";
	}
private:
	int m_data;
};
//方式一
Test fun(const Test &t)
{
	int value = t.GetData();
	Test tmp(value);
	return tmp;
}

void main()
{
	Test t(10);

	Test t1;
	t1 = fun(t);
	cout<<"m_data of t1 is: ";
	t1.print();


	Test t2 = fun(t);
	cout<<"m_data of t2 is: ";
	t2.print();

}
</span>


下来总结一下返回引用和非引用:


再看一个程序:

/**********************************************************************   
* Copyright (c)2015,WK Studios 
* Filename:     
* Compiler: GCC  VC6.0  win32   
* Author:WK   
* Time: 2015 6 6
************************************************************************/

#include<iostream>
using namespace std;
//#define QUOTE
class S
{
public:
	S (int n=0):m_data(n)
	{
	cout<<"Create the object!"<<this<<"\n";
	}
  ~S()
   {
  	cout<<"Free the object!"<<this<<"\n";
   } 
   #ifdef  QUOTE
   S& S::operator =(S&a);
   #else
   S operator =(S &a);	
#endif
   S (S &a);
   S operator+(S &a);
private:
	int m_data;

};
int main()
{
S c(1),b(0);
S a=c=b=(S)99;//从右至左,先是用99生成一个临时对象,在调用两次赋值函数,在调用一次拷贝构造
S d;
d=c=b=(S)99;//vc6.0不支持直接 d=c=b=99但是vs2013支持,本质还是用99构造一个临时对象

S h=a+b+c;//从右向左依次进行相加最后拷贝构造

S j;
j=a+b+c;

S t=c;
return 0;
}
#ifdef QUOTE
S& S::operator =(S&a)
{
    if(this!=&a)
	{
	m_data=a.m_data;
	}
	cout<<"= quote Operator  "<<this<<endl;
   return *this;
}
#else
S S::operator =(S &a)
{
  if(this!=&a)
  {
    m_data=a.m_data;
  }
cout<<"= Operator  "<<this<<endl;
  return S(*this);
}
#endif

S::S(S &a)
{
cout<<"Copy  "<<this<<endl;
m_data=a.m_data;
}

S S:: operator+(S &a)
{

return S(this->m_data+a.m_data);
}

  对于赋值运算符因为返回的是全局的*this所以可以使用引用返回也可以使用对象返回,但是用引用返回不是效率跟高吗?所以大多数选用引用返回



评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值