(C/C++学习)21.C++中返回引用和返回对象以及传引用和传对象问题

时间:2022-05-23 06:43:42

说明:在学习和编写C++代码时,经常会遇到这样的问题:一个带返回值的函数,到底应该返回值呢,还是应该返回引用呢;在传递参数的时候,是应该传递参数的引用呢,还是应该传值呢?请看下面代码:

  1 void myswap(int &a, int &b)
2 {
3 int temp = a;
4 a = b;
5 b = temp;
6 }

相信上面代码大家经看到,这就是一个常见的交换两个整数值的代码,但如果传递参数里面传的是值而不是引用呢,答案是这样的交换根本没用。

探讨:

1.其实当按引用传递对象的时候,调用函数以及被调用的函数都是对同一个对象进行操作,即传递的是对象本身;而当传递对象(值)的时候,会调用拷贝构造函数产生一个临时变量,而该临时的值即为传递参数的值。而此时,调用函数中操作的是原对象,即传递的对象,而被调用函数操作的只是原对象的一个副本,即通过拷贝构造函数生成的模子,因此,才有了上述交换失败的情况。

2.同样的道理, 返回对象时会生成返回对象的副本,返回对象的时间包括了调用复制构造函数来生成副本所需的时间和调用析构函数删除副本所需的时间。而返回引用则可以节省时间和内存。

  1 Person& Person::operator++()
2 {
3 age = 10;
4 return *this;
5 }
6 Person Person::operator++()
7 {
8 Person tmp(10); //创建对象
9 tmp.age = 20;
10 return tmp; //返回对象的副本,此处不能返回引用
11 }
12

3.然而并不是所有地方都可以返回引用的,当被调用函数中新建了一个变量时,该变量是不能返回引用的。因为临时变量是有生命周期的,即在被调用函数内该临时变量才会存在,当函数结束并准备返回参数时,该临时变量已经不存在,这种情况下返回它的引用是不允许的。而这时候返回对象却是可以的,因为你返回的仅仅是其通过拷贝构造函数产生的一个副本。