09月19, 2007

c++陷阱之临时变量

先看代码:

我们开始都会认为在调用Say()之后,对象d的m_b成员变量会被修改为7但是结果却输出“1”,原因如下:

50,51行处出现了一个$T563,这其实是一个C++生成的临时对象汇编代码

37,38行如下:

37 _d$ = -8      
38 $T563 = -12
( sizeof(Derived)==8, sizeof(Base)==4 )

上面

mov eax,DWORD PTR _d$[ebp]
mov DWORD PTR $T563[ebp],eax

这段代码是将对象d的内容拷贝到临时变量中,并且只拷贝Base中有的部分,这样做 就是所谓的“Slicing”。有些书中说这一步是由拷贝构造函数完成的。概念上是这样的, 但是实际上,编译器并没有生成一个真正意义上的拷贝构造函数。

这更进一步说明C++产生了一个临时对象作为强制转换的中间结果。然后以这个临时 对象代替我们的对象d,来调用函数Say()。那么结果自然是,临时变量的m_b被改变, 而我们的d.m_b没有发生变化

这种强制类型转换就是所谓的"向上转型",upcasting。 也叫Object Slicing。这种操作应该避免使用

本文链接:http://aztack.wang/post/object-slicing-in-cpp.html

-- EOF--

Comments

评论加载中...

注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理。