关于C++的返回对象
总结一下C++返回对象的几种方式
这里主要总结两种:
返回对象的引用
返回指向const对象的引用
这种是常见的返回方式,相对于返回对象,这种方式能够提高效率。
如果函数返回传递给他的对象(不是函数内部的局部变量),则返回该对象的引用会提高效率。这是因为:
返回对象要先创建一个临时对象,并将这个临时对象初始化为要返回的对象,这样就会调用类的复制构造函数,这样直接返回引用就不会有前面的一些附加操作,因此效率会高。
注意:若返回的对象本身在参数中就是const
引用,则返回类型必须是const
,这样才匹配。
返回指向非const对象的引用
两种常见的返回非const对象的情况是:
- 重载复制运算符,在这里之所以不返回指向const对象的引用是为了能够修改返回的对象。
- 与
cout
一起使用的<<
运算符,这里是必须声明称非const的返回对象,例如第一个1
2
3ostream & 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
对象。