关于C++函数思考2(C++函数返回引用和返回非引用的区别)
2015-06-07 16:46
609 查看
引用是提高代码效率的一大利器,尤其对于对象来说,当引用作为参数时候不用大面积的复制对象本身所造成的空间与时间的浪费。所以有时候对于参数的返回值我们也希望返回参数的引用。在这里我们回忆一下C语言函数返回局部变量所注意的方面,也可以看我的这篇文章。下来我们对于C++
中函数返回引用或非引用进行探讨!!
1.返回引用
2.返回非引用
下来总结一下返回引用和非引用:
再看一个程序:
对于赋值运算符因为返回的是全局的*this所以可以使用引用返回也可以使用对象返回,但是用引用返回不是效率跟高吗?所以大多数选用引用返回
中函数返回引用或非引用进行探讨!!
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所以可以使用引用返回也可以使用对象返回,但是用引用返回不是效率跟高吗?所以大多数选用引用返回
相关文章推荐
- C语言(1) HelloWord 与JAVA对比
- C++和JAVA的区别
- 面试考题之9.2:链表(C/C++版)
- 用C++实现多线程Mutex锁(Win32)
- C++11:override 与 final
- C/C++ 语言中的表达式求值
- C语言多线程下不同等级日志的实现
- c++ 访问者模式
- c++在string类源
- Microsoft Visual C++ Runtime Library Runtime Error解决的方式
- 在mfc中使用cef
- 设计模式之访问者模式,C++实现
- Effective C++ 条款45
- effective c++ 条款7
- C++开发者都应该使用的10个C++11特性
- C++函数的返回值问题(1)——返回引用类型&非引用类型
- 我所理解的设计模式(C++实现)——访问者模式(Visitor Pattern)
- c++四种强制转换
- C++字符串转数字,数字转字符串
- 【C++】String类中的运算符重载