首页 / 软件开发 / C++ / 关于对象生命历程的会话
关于对象生命历程的会话2011-04-19宋科(译者注:我从网上看到这篇文章的原文,非常喜欢作者的写作风格,于是就利用业余时 间将它翻译出来,并贴到网上,希望大家可以从中受益,因为我没有和作者或者这篇文章的 版权所有者联系以取得这篇文章的版权,所以这篇中译文的版权不应归我所有,而且我未从 中获得任何利益!而且,我对原作者及其版权所有者的敬仰有如涛涛江水,所以我绝没有侵 犯原作者的任何意图。当然,要说“利益”还是有的,就是我加深了如下C++的知 识:只能被绑定到一个常量的、非易失的引用上,左值却没有这样的限制;函数返回的引用是 左值。而且不管怎么说,如果一个对象的构造函数中引用了的临时对象,而对象在该构造函数 构造结束时就消逝了的话,那么该对象就成了一个“野引用”了。如果我理解得 有错的话,请一定告诉我一声,谢谢,kesongemini@vip.163.com。还有 Herb Sutter 先生 的《more C++ Exceptional》中文版已经由华中科技大学出版社出版,小弟窃喜着买了一本 ,沈阳三好街的大松科技书店进新书的速度快得惊人,都是8折,不知道还有没有更便宜的地 方:)假日前不久的那几天,我就那么一次没有感觉到最后期限(deadline )的压力― ―我正在做的这个项目都已经按计划完成了。我选择了最喜欢的消遣方式,撇掉了 source repository(译者:源码智囊团?不懂,是一款分析源码的软件吗?)。我经常在研读 别人代码时,学习一些他们的技巧(对我来说是新的),以及学习如何避免他们代码中的错 误。class T
{
public:
T & ref() { return *this; }
};
void f( T & );
int main()
{
f( T().ref() );
}
开始时,我没有理解ref()函数的重点,因此我删除了对它的调用――我认为下边这 样的代码应该可以正常运行:int main()
{
f( T() );
}
然而,当我编译时,编译器提示有个错误:将非常量引用绑定到一个临时对象。我轻拍着前 额――当然了,这种绑定是不允许的。回想起第一次遇到这类错误的时候the Guru(译者: 下文按领袖译)给我的解释。她说道:“禁止这种绑定的一个原因是为了防止 狡猾的bug,我的孩子,看看下面的情况”class U
{
// ... 任 何代码 ...
};
void takesAndModifiesU( U & u )
{
// 执 行操作以修改u的状态
}
class V
{
public:
operator U();
};
void g()
{
V v;
// ...
takesAndModifiesU( v );
// ...
}