【C++】C++引用返回值需谨慎

源地址 http://onlywish.me

引用不像指针那么复杂,又不拷贝空间,一直比较喜欢它。

于是深入探究C++引用的问题

殊不知,不知道引用返回值的使用方式有很大的风险

基础:

当对象进行值传递时。会调用类的拷贝构造函,常见的,函数形参。=号赋值。

我进行了如下的实验:

有一个函数 定义如下:

A & func();

返回一个类的引用

原来,我都是这样调用的。 A a = func();我相信大部分人都是这么调用

经过实验发现,这样会调用一次拷贝构造函数

其实是把返回值返回了一个引用到栈里边,然后变量a又拿栈里边的对象复制了一次

所以,以后调用引用函数时,要这样调用 A & a = func();

假如要给别人写类包,尽量避免引用返回,因为错误的调用会导至堆内存的数据无法释放。

时间: 2024-10-19 19:03:40

【C++】C++引用返回值需谨慎的相关文章

引用参数与引用返回值 类的拷贝构造

引用地址  http://www.cnblogs.com/bigshow/archive/2008/11/10/1330514.html 经常看到这样的声明:T& func(T& t),这种声明和T func(T t)有什么区别?书上的解释是为了提高效率,究竟是如何提高效率的呢?内部执行了什么操作?本文通过8个小例子对引用参数和引用返回进行了一次彻底的排查.    首先看一下在类的成员函数中的引用参数和引用返回值: 类定义class A{     public:      int x; A

用引用返回值

函数返回值时,要生成一个值的副本.而用引用返回值时,不生成值的副本. 例如,下面的程序是有关引用返回的4种形式: //********************* //** ch9_6.cpp ** //********************* #include <iostream.h> float temp; float fn1(float r) { temp = r*r*3.14; return temp; } float& fn2(float r) { temp = r*r*3.

引用参数,引用返回值

函数形参诗引用,程序输出如程序最后的注释,表明引用s代表的是对象s2. //函数中的引用 #include<iostream> using namespace std; class Sample { int x; public: Sample(int a): x(a) { cout<<"call constructor Sample(int a)"<<endl; } Sample(Sample &a): x(a.x) { cout <&

转: 引用作为函数返回值

转自:http://blog.csdn.net/vivi_wang_11/article/details/7437382 函数返回值时,要生成一个值的副本.而用引用返回值时,不生成值的副本. 例如,下面的程序是有关引用返回的4种形式: //********************* //** ch9_6.cpp ** //********************* #include <iostream.h> float temp; float fn1(float r) { temp = r*r

函数的返回值是如何带出和接收的以及内存中的活动情况.RP

函数返回值时,要生成一个值的副本. 而用引用返回值时,不生成值的副本. 例如,下面的程序是有关引用返回的4种形式: //********************* //** ch9_6.cpp ** //********************* #include <iostream.h> float temp; float fn1(float r) { temp = r*r*3.14; return temp; } float& fn2(float r) { temp = r*r*3

理解-加号重载要使用全局函数+返回值非引用

一.C++中的加号重载使用全局函数的一个有点是可以使用级联的方式进行加法操作. Fraction a,b,c,d,e; A=b+c+d+e; 若为成员函数 1.返回的b的this指针分别作用于后面的变量,因此是对b的修改: 2.如果返回一个新的变量,上面的级联的问题似乎可以解决. 3.问题在于如果存在隐式类型转换,且第一个参数为需要转化的类型时,可能找不到该定义的成员函数,因此使用全局的方式可以便面这个问题 二.返回值需要时一个值,而不是引用 从一个局部函数返回引用,可以考虑两种情况. 1.如果

传引用作为形参和返回值_节省参数拷贝的时间

基本的传引用概念 #include <bits/stdc++.h> using namespace std; //说出以下两个函数的区别 int& whatf(int &a,int &b) //如果不希望函数执行过程中 某变量被修改 用const限定 { a=3;b=2; return a; } int whath(int a,int b) { a=3;b=2; return a; } int main() { int a,b; whatf(a,b)++; cout&l

将引用作为函数返回值的优缺点

格式:类型标识符 &函数名(形参列表及类型说明){ //函数体 }好处:在内存中不产生被返回值的副本:(注意:正是因为这点原因,所以返回一个局部变量的引用是不可取的.因为随着该局部变量生存期的结束,相应的引用也会失效,产生runtime error!注意事项:(1)不能返回局部变量的引用.这条可以参照Effective C++[1]的Item 31.主要原因是局部变量会在函数返回后被销毁,因此被返回的引用就成为了"无所指"的引用,程序会进入未知状态.(2)不能返回函数内部new

运算符重载时返回值是否需要添加引用?

1. 如果返回值会被赋值,就必须返回引用,例如=重载 2. 如果返回值是一个局部变量,就一定不能返回引用,例如+重载 3. 如果为了提高效率,参数就可以使用引用. 4. 而[]的实际参数经常是一个常量,常量是无法使用引用,所以不能用引用作为[]的参数.