传值 传引用 函数返回值

原创 2007年10月02日 15:00:00

1.函数只能返回值,而不适合返回引用和指针的情况。
Never return a reference to a local object or to a dereferenced pointer initialized by new within the

function.
函数返回时不要返回一个局部对象的引用或函数体中new建立的指针。
这会导致下面问题的产生:
The function return references to objects that don't exist
因为函数返回(结束)时,局部对象将释放或析构,将导致返回的引用指向一个不存在的对象。
我们说:在能返回references时返回尽量使用返回references而不要返回value以提高效率,不能返回references时就

返回value。那么在什么情况下不能返回references?比较下面的几个函数:

Student returnStudent(Student s) { return s; }

const Student& returnStudent(const Student& s)

inline const Rational operator*(const Rational& lhs,
                         const Rational& rhs)
{
return Rational(lhs.n * rhs.n, lhs.d * rhs.d);
}

// incorrect
inline const Rational& operator*(const Rational& lhs,
                         const Rational& rhs)
{
return Rational(lhs.n * rhs.n, lhs.d * rhs.d);
}

这四个函数按功能分为两组,头两个一组,后面两个一组,在第一组中第二个函数效率比第一个好,因为它返回的是一

个引用。但在第二组中,如果你试图返回一个引用将得到一个错误,例如最后一个函数就是这样。因为它返回的是一个

函数体内建立的临时对象的引用,一旦函数返回,此临时对象也将毁灭。导致返回的引用的不确定性。而第二个函数返

回的不是一个局部对象的引用,它返回的是以参数形式传入给函数的对象的引用。

2.Prefer pass-by-reference to pass-by-value.
如果能够使用传引用,尽量使用传引用,而不要使用传值(包括函数参数和函数返回值)
这样做的好处有:
a.主要是用来提高效率。
b.有时可以避免对象切割问题。
建议:当处理函数参数时,如果不是build-in类型或类型较大,就使用引用,可以使用const来限制函数体中对引用的对象做修改。但是当处理函数返回值时必须考虑能否返回一个引用。

3.函数返回值(return value)时的一些优化问题
// the most efficient way to write a function returning
// an object
inline const Rational operator*(const Rational& lhs,
                                const Rational& rhs)
{
  return Rational(lhs.numerator() * rhs.numerator(),
                  lhs.denominator() * rhs.denominator());
}

// the less efficient way to write a function returning
// an object
inline const Rational operator*(const Rational& lhs,
                                const Rational& rhs)
{
  Rational result(lhs.numerator() * rhs.numerator(),
                  lhs.denominator() * rhs.denominator());
  return result;
}

// the most inefficient way to write a function returning
// an object
inline const Rational operator*(const Rational& lhs,
                                const Rational& rhs)
{
  Rational result = Rational(lhs.numerator() * rhs.numerator(),
                             lhs.denominator() * rhs.denominator());
  return result;
}

在函数体中进行函数定义时,尽量避免临时object的产生和赋值运算(assignment),减少Constructor和Destructor,以提高效率。 

相关文章推荐

printf函数返回值

  • 2015年08月26日 10:39
  • 95B
  • 下载

关于函数返回值的讨论

  • 2012年08月29日 14:46
  • 219KB
  • 下载

函数返回值是const或者const引用

const表明一个值是不可更改的,我一直试图了解如下语句中,const的作用 const int & getInt(); int & getInt(); 二者的差距在于前者的返回值是个右值,后者...

C++ 函数返回值为引用

C++函数的返回值——返回引用类型&非引用类型 函数的返回主要分为以下几种情况: 1、主函数main的返回值: 允许主函数main没有返回值就可结束;可将主函数main返回的值视...

函数返回值的传递方式(值传递、指针传递、引用传递)

形参和实参之间存在值的传递,与此同时,函数的返回值同样也c

函数返回值和返回引用是不同的

函数返回值时会产生一个临时变量作为函数返回值的副本,而返回引用时不会产生值的副本,既然是引用,那引用谁呢?这个问题必须清楚,否则将无法理解返回引用到底是个什么概念。...

黑马程序员_学习日记37_601基础加强(enums_truct_类型转换_值类型与引用类型_异常处理_函数返回值)

1、索引器(我理解索引器是给数组提供了成为属性的方法) public class Chinese {        privatestring[] names = new string[]{“乔...

将“引用”作为函数返回值类型的格式、好处和需要遵守的规则

格式:类型标识符 &函数名(形参列表能类型说明){ //函数全} 好处:在内存中不门生被返回值的整本 注意:1)不能返回局部变量的引用。因为局部变量在函数运行结束后被销毁,因此被返回的引用也就马为...
  • nocml
  • nocml
  • 2012年02月01日 14:16
  • 1854

c++函数返回值与引用

对于函数的返回值,看似简单,但并非如此,比如: int func(int a);该函数会返回一个int型,如果进行一个调用int result=func(3);会发生什么情况? 首先,fu...

在函数返回值需要使用到强制类型转换时,最好使用指针,光使用引用不保险

这两天发现Android中java上层传递下来的ISurface,我在底层居然画不出图像,但是如果我在底层自己创建ISurface却是可以的...这让我和我同事纠结无比,四处找原因... 由于这个现象...
  • niino
  • niino
  • 2011年03月29日 16:39
  • 2261
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:传值 传引用 函数返回值
举报原因:
原因补充:

(最多只允许输入30个字)