总结一下C++返回对象的几种方式

这里主要总结两种:

  1. 返回指向const/非const对象的引用
  2. 返回const/非const对象

返回对象的引用

返回指向const对象的引用

这种是常见的返回方式,相对于返回对象,这种方式能够提高效率
如果函数返回传递给他的对象(不是函数内部的局部变量),则返回该对象的引用会提高效率。这是因为:

返回对象要先创建一个临时对象,并将这个临时对象初始化为要返回的对象,这样就会调用类的复制构造函数,这样直接返回引用就不会有前面的一些附加操作,因此效率会高。

注意:若返回的对象本身在参数中就是const引用,则返回类型必须是const,这样才匹配。

返回指向非const对象的引用

两种常见的返回非const对象的情况是:

  1. 重载复制运算符,在这里之所以不返回指向const对象的引用是为了能够修改返回的对象。
  2. cout一起使用的<<运算符,这里是必须声明称非const的返回对象,例如
    1
    2
    3
    ostream & operator<<(cout, s1);
    ...
    cout << s1 << " is coming";

第一个<<返回用于显示s1内容的对象,第二个<<返回用于显示" is coming"的对象,每次都不一样,因此不能使用const关键字(个人理解)

另外,如果返回的对象没有公共的复制构造函数(如cout对象),则必须返回引用,不然你返回对象也找不到复制构造函数创建临时对象啊。

返回对象

返回非const对象

如果返回的对象是在函数内部生成的局部变量,就不能返回其引用了,因为当函数执行完毕后,该变量的就会销毁,所谓的指向其的引用也就没有任何意义了。
一般在重载+运算符的时候会返回对象,而不是对象本事,因为会创建一个新对象,这个对象是在函数体内生成的,具有局部作用域。

返回const对象

其实一般在重载+运算符的时候返回的是const对象,这是为了避免某种错误。
之所以返回对象是为了能够如下使用+运算符:

1
r = a + b;

然而若不返回const对象则会造成,如下语句也是合理的:

1
a + b = r;

该语句之所以编译器不报错,是因为a + b会返回一个非const的临时对象,然后复制语句= r会将r赋值给这个临时对象,之后这个临时对象就会销毁掉了。其中并没有任何错误可报告的,毕竟返回的这个临时对象的内容是可以修改的嘛。
因此返回const对象就不允许修改返回的临时对象的内容,遇到这种语句自然就会报错了。因此

在重构类似+-等运算符时,要返回const对象。

Comments