传值 传引用 函数返回值

原创 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,以提高效率。 

C/C++ 函数参数和返回值传递机制

原文:C/C++ 函数参数和返回值传递机制 作者:Breaker 说明 C/C++ 函数调用中,参数和返回值传递的机制,包括低级汇编指令和高级 C++ 对象拷贝构造 关键字:参数传...
  • O_surface_O
  • O_surface_O
  • 2014年09月19日 09:45
  • 1116

Java 函数的参数引用,通过传入参数带回函数运行结果

Java没有指针,在需要由参数直接带回结果的情况下,较C语言相比有一点差别,C任何类型可通过指针传递,在Java中,需要自定义一个类,而类可以通过函数的参数返回结果。   public class t...
  • joyous
  • joyous
  • 2013年07月18日 19:36
  • 17138

php函数引用返回的详解

函数引用与php中变量引用一样使用的是&符号了,今天我们就一起来看看函数的引用返回的一些例子,希望这些例子能够对各位有帮助. 引用返回 手册里是这么写的:引用返回用在当想用函数找到引用应该...
  • u010889390
  • u010889390
  • 2016年09月14日 16:21
  • 1288

C++函数参数传值OR传引用_C++函数返回值返回对象OR对象引用

传值(pass by value):即形参接收实参传递过来的值,如果是自定义类型,要调用拷贝构造函数。函数处理的是形参的值。       传引用(pass by reference):引用表示与原对...
  • haohaizijhz
  • haohaizijhz
  • 2015年05月13日 17:28
  • 282

printf函数返回值

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

关于函数返回值的讨论

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

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

形参和实参之间存在值的传递,与此同时,函数的返回值同样也c
  • Zju_Jemery
  • Zju_Jemery
  • 2014年05月20日 21:19
  • 865

C++ 函数返回值为引用

C++函数的返回值——返回引用类型&非引用类型 函数的返回主要分为以下几种情况: 1、主函数main的返回值: 允许主函数main没有返回值就可结束;可将主函数main返回的值视...
  • going_fighting
  • going_fighting
  • 2016年10月16日 15:33
  • 121

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

const表明一个值是不可更改的,我一直试图了解如下语句中,const的作用 const int & getInt(); int & getInt(); 二者的差距在于前者的返回值是个右值,后者...
  • wendy709468104
  • wendy709468104
  • 2013年04月24日 22:38
  • 541

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

函数返回值时会产生一个临时变量作为函数返回值的副本,而返回引用时不会产生值的副本,既然是引用,那引用谁呢?这个问题必须清楚,否则将无法理解返回引用到底是个什么概念。...
  • dmffrank
  • dmffrank
  • 2016年12月19日 16:43
  • 244
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:传值 传引用 函数返回值
举报原因:
原因补充:

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