C++函数返回引用
2015-09-23 19:44
232 查看
转自:http://blog.csdn.net/randyjiawenjie/article/details/6727196
首先需要明白:C++函数为什么要返回引用?
答:这样就不用返回结果的副本。因为返回副本需要做赋值拷贝函数,浪费时间。这时候,实际上,返回是结果的副本,而不是结果本身。如果要返回本身,就返回引用就OK了。
例1:
[cpp] view
plaincopy
const string manip2(const string& s){
string ret = s;
return ret;
}
此时,返回的不是ret本身,而是ret的副本。这个副本调用复制构造函数,与ret一摸一样。无法区别它和ret,带来的性能的损失。
记住,C++函数返回引用,一定不能返回指向本地的变量的引用。否则,函数运行完毕,本地变量销毁,那这个引用是谁的别名呢?who knows,程序只有崩溃了。
C++函数如果返回引用,就要返回在这个函数之前就存在的变量的引用才行。
例2。C++函数返回本地变量的引用
[cpp] view
plaincopy
const string& manip1(const string& s){
string ret = s;
return ret; //never do this
}
可以看出,例子1和例子2的区别是很微妙的,只有返回值类型不一样:string和string&。如果申明了string&,那么函数就直接返回了ret而不是ret的副本。当函数结束的时候,ret变量被销毁,如果主函数用到了这次函数的调用,程序立即崩溃。我刚才试了试,确实崩溃了。
哈哈,谁都不想看到上面的那个图吧。而且,在编译的时候,编译器也给出了警告:..\test.cpp:4:9: warning: reference to local variable 'ret' returned
这里是测试代码:
[cpp] view
plaincopy
# include <iostream>
using namespace std;
const string& manip1(const string& s){
string ret = s;
return ret;
}
const string manip2(const string& s){
string ret = s;
return ret;
}
int main(){
string test("hello,world");
string result1 = manip1(test);
string result2 = manip2(test);
cout << result1 << endl;
cout << result2 << endl;
}
我前面自己写两个complex的复数类实现点击查看。
在重载+运算符号的时候,我就是返回的引用:
[cpp] view
plaincopy
my_complex& my_complex::operator +(const my_complex& rhs) {
real = rhs.real + real;
imag = rhs.imag + imag;
return *this;
}
由于我返回的引用在此次调用函数之前就已经存在(*this),那么,我返回的引用是合适的。而我看了看不少网上其它人的实现,这里返回的都是my_complex,不是一个引用。也许还有其它考虑。
首先需要明白:C++函数为什么要返回引用?
答:这样就不用返回结果的副本。因为返回副本需要做赋值拷贝函数,浪费时间。这时候,实际上,返回是结果的副本,而不是结果本身。如果要返回本身,就返回引用就OK了。
例1:
[cpp] view
plaincopy
const string manip2(const string& s){
string ret = s;
return ret;
}
此时,返回的不是ret本身,而是ret的副本。这个副本调用复制构造函数,与ret一摸一样。无法区别它和ret,带来的性能的损失。
记住,C++函数返回引用,一定不能返回指向本地的变量的引用。否则,函数运行完毕,本地变量销毁,那这个引用是谁的别名呢?who knows,程序只有崩溃了。
C++函数如果返回引用,就要返回在这个函数之前就存在的变量的引用才行。
例2。C++函数返回本地变量的引用
[cpp] view
plaincopy
const string& manip1(const string& s){
string ret = s;
return ret; //never do this
}
可以看出,例子1和例子2的区别是很微妙的,只有返回值类型不一样:string和string&。如果申明了string&,那么函数就直接返回了ret而不是ret的副本。当函数结束的时候,ret变量被销毁,如果主函数用到了这次函数的调用,程序立即崩溃。我刚才试了试,确实崩溃了。
哈哈,谁都不想看到上面的那个图吧。而且,在编译的时候,编译器也给出了警告:..\test.cpp:4:9: warning: reference to local variable 'ret' returned
这里是测试代码:
[cpp] view
plaincopy
# include <iostream>
using namespace std;
const string& manip1(const string& s){
string ret = s;
return ret;
}
const string manip2(const string& s){
string ret = s;
return ret;
}
int main(){
string test("hello,world");
string result1 = manip1(test);
string result2 = manip2(test);
cout << result1 << endl;
cout << result2 << endl;
}
我前面自己写两个complex的复数类实现点击查看。
在重载+运算符号的时候,我就是返回的引用:
[cpp] view
plaincopy
my_complex& my_complex::operator +(const my_complex& rhs) {
real = rhs.real + real;
imag = rhs.imag + imag;
return *this;
}
由于我返回的引用在此次调用函数之前就已经存在(*this),那么,我返回的引用是合适的。而我看了看不少网上其它人的实现,这里返回的都是my_complex,不是一个引用。也许还有其它考虑。
相关文章推荐
- string c++ 详解 erase find .
- c++设计模式----解释器模式interpreter
- 【c++ templates读书笔记】【2】类模板
- 【c++ templates读书笔记】【2】类模板
- C++一个简单的手柄类模板
- C++学习记录之STL函数
- 如何使用Valgrind memcheck工具进行C/C++的内存泄漏检测
- OC语言混合编辑
- cmd下nmake编译c++文件提示找不到VC下面的头文件
- RichEdit的复制与粘贴
- 只恨当初没有你——C++等级选择篇(一)
- C常用函数的实现
- 用C开发一个简易的webserver
- Largest Point
- C语言中的知识点
- c++里面的namespace
- C++的学习心得
- 乘法口诀表
- C语言求10个整数中的最大值
- 面试---c和c++的区别