必须返回对象,而不是引用
来源:互联网 发布:矩阵归一化例题 编辑:程序博客网 时间:2024/05/03 05:38
必须返回对象,而不是引用
通过引用传递对象,可以看到从效率到简洁性的各种好处,但事实是,返回值并非一定要返回引用,特别是,对于那些必须返回对象的函数而言,返回引用往往导致未定义的错误。
这里定义一个简单的类,只含有一个数据成员:
class X
{
int i;
public:
X(int ii=0):i(ii){}
friend const X& operator*(const X& lhs,const X& rhs);
};
其实现版本为:
const X& operator*(const X& lhs,const X& rhs)
{
return X(lhs.i * rhs.i);
}
这里返回的对象X其实只是一个临时对象,当函数执行结束时,这个临时对象就会被销毁,但返回为引用,从而这个引用是一个未知对象的别名,任何使用这个引用的地方都将可能会导致未定义行为。
那么是否可以不销毁这个对象,这样不就可以返回引用了么?解决方法也很简单,我们直接声明这个对象为static不就可以啦:
const X &operator*(const X& lhs,const X& rhs)
{
static X temp;
temp=... //相关操作
return temp;
}
每一次调用函数,这个static对象将不会被销毁,从而返回其引用也就不会导致未定义行为,那么这个问题得到实质性解决了么?如果使用一下调用的话
X a(1),b(2),c(3),d(4);
if(a*b==c*d) {}
很遗憾,这里我们调用两次operator*,得到两个返回值,再调用==操作符,去比较它们是否相等,但得到的结果将永远为真,而且必须说明的是,每一次调用operator*,temp的值都将改变,但由于返回的是static的引用,所以调用端看到的永远是temp的现值,因而得到结果恒真也就不难理解啦!
正确的解决方案是,本来就该返回对象的值,我们就不要再去返回引用,每一次想返回引用时,就去思考一次返回的这个引用的另一个别名是什么,如果没有,那么最好的方法还是直接返回对象。毕竟,要考虑到返回一个已经被销毁对象的引用,其后果有多么严重!
- 必须返回对象,而不是引用
- C++箴言:必须返回对象时别返回引用
- C++箴言:必须返回对象时别返回引用
- C++箴言:必须返回对象时别返回引用
- 【Effective C++】必须返回对象时,别妄想返回引用
- 必须返回一个对象时,不要试图返回一个引用
- Effective C++学习笔记:必须返回一个对象时不要试图返回一个引用
- effective c++ 条款23: 必须返回一个对象时不要试图返回一个引用
- effective c++ 条款23总结: 必须返回一个对象时不要试图返回一个引用
- Effective c++条款23: 必须返回一个对象时不要试图返回一个引用
- effective C++笔记之条款23:必须返回一个对象时不要试图返回一个引用
- 条款 23: 必须返回一个对象时不要试图返回一个引用
- 必须返回对象时,别妄想返回引用(Effective C++_21)
- 条款21:必须返回对象时,别妄想返回其引用
- Effective C++——必须返回对象时,别妄想返回其引用或指针
- Effective Item 21: 当你必须返回一个对象时不要试图返回一个引用
- C++运算符重载,+-*/的重载,返回值为什么是对象而不是对象的引用?而流操作符<< 和 >> 却返回的是引用?
- C++运算符重载,+-*/的重载,返回值为什么是对象而不是对象的引用?而流操作符<< 和 >> 却返回的是引用?
- Tomcat发布项目方法
- ListBox 和 ComboBox 控件
- Commando War(突击战)
- 湖南省第八届大学生计算机程序设计竞赛C题(UVA 12504)
- Java IO流读写文件的几个注意点
- 必须返回对象,而不是引用
- 轻松破解Microsoft excel 2007 密码保护图文教程
- 黑马程序员_网络编程
- 用html描述网页
- 学车
- NS-3命令行参数
- Raw Socket(原始套接字)实现Sniffer(嗅探)
- 使用non-member函数
- 黑马程序员_交通灯管理系统