WEB开发网
开发学院软件开发VC 关于对象生命历程的会话 阅读

关于对象生命历程的会话

 2007-03-16 21:57:35 来源:WEB开发网   
核心提示: 她说道:“禁止这种绑定的一个原因是为了防止狡猾的bug,我的孩子,关于对象生命历程的会话(2),看看下面的情况”class U{// ... 任何代码 ...};void takesAndModifiesU( U & u ){// 执行操作以修改u的状态}class

她说道:“禁止这种绑定的一个原因是为了防止狡猾的bug,我的孩子,看看下面的情况”class U
{
  // ... 任何代码 ...
};
void takesAndModifiesU( U & u )
{
  // 执行操作以修改u的状态
}
class V
{
public:
operator U();
};
void g()
{
V v;
// ...
takesAndModifiesU( v );
// ...
}
“如果允许那种绑定,编译器将调用转换操作符operator(),创建一个临时的U类的对象。这个匿名的临时对象将被传递到takesAndModifiesU,被修改,接着在函数调用完成之后被丢弃。原来的对象v,不会被改变――这会让这段代码的作者困惑不解的。”

然而,我真的困惑了。我不能理解原来的语句f(T().ref());为何能能够编译――那不也是将一个非常量引用绑定到一个临时对象上了么?

“我的孩子,你必须学会多思考一步”,领袖(The Guru)的声音从我耳边传来,而不是记忆中,让我着实吃了一惊,“考虑一下左值和右值。神圣的标准(ISO C++ 吗?)告诉我们可以用形式为T()的显示的类型转化创建一个右值。一个右值只能被一个常量的、非易失(non-volatile)的引用绑定,但是一个左值没有这样的限制。而且,函数返回一个引用的话,那么返回值就是左值。因此,编译器能够将绑定ref()绑定到一个非常量引用。”

“这样呀,只有我调用某一个返回值是引用的函数,就可以了吧,”我回答道,“嗨――赋值操作符返回一个引用,因此我可以这样写吧f( T() = T() );不错吧!”我热情洋溢。“我能想到这个技巧的许多用处哟。”

上一页  1 2 3 4  下一页

Tags:关于 对象 生命

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接