关于thinking in c++第11章的错误

wolfcom 2007-08-12 10:47:08
#include <iostream>
using namespace std;

class CA
{
public:
CA();
CA(const CA &ca);
~CA();

private:
int i;
};

CA::CA():i(0)
{
cout<<"CA constructor";
}

CA::CA(const CA &ca)
{
i = ca.i;
cout<<"CA Copy constructor"<<endl;
}

CA Copy(CA ca)
{
cout<<"copy return"<<endl;
return ca;
}

CA::~CA()
{
cout<<"CA Destroy call"<<endl;
}

int main()
{
CA a;
CA b = Copy(a);
return 0;
}
/////////////////////////////////////
0040110C /$ 55 PUSH EBP ; main函数
0040110D |. 8BEC MOV EBP,ESP
0040110F |. 51 PUSH ECX
00401110 |. 51 PUSH ECX
00401111 |. 8D4D FC LEA ECX,DWORD PTR SS:[EBP-4]
00401114 |. E8 3BFFFFFF CALL test.00401054
00401119 |. 51 PUSH ECX ; 此是临时对象
0040111A |. 8D45 FC LEA EAX,DWORD PTR SS:[EBP-4]
0040111D |. 8BCC MOV ECX,ESP
0040111F |. 50 PUSH EAX ; 引用的本质是传递指针 EAX即为h的地址
00401120 |. E8 4AFFFFFF CALL test.0040106F ; 调用拷贝构造函数 CA(CA&) 是stdcall
00401125 |. 8D45 F8 LEA EAX,DWORD PTR SS:[EBP-8] ; 传递第二个对象的地址(此时未构造)
00401128 |. 50 PUSH EAX
00401129 |. E8 77FFFFFF CALL test.004010A5 ; 是c形式调用 此时调用Copy(CA)
0040112E |. 59 POP ECX ; 抛出的是传递的第二个对象的地址(函数返回时临时对象未消失!!!)
0040112F |. 59 POP ECX ; 此时抛出来的是拷贝构造函数的地址
00401130 |. 8D4D F8 LEA ECX,DWORD PTR SS:[EBP-8]
00401133 |. E8 AEFFFFFF CALL test.004010E6 ; 析构函数
00401138 |. 8D4D FC LEA ECX,DWORD PTR SS:[EBP-4]
0040113B |. E8 A6FFFFFF CALL test.004010E6
00401140 |. 33C0 XOR EAX,EAX
00401142 |. C9 LEAVE
00401143 \. C3 RETN

...全文
156 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
wolfcom 2007-08-29
  • 打赏
  • 举报
回复
多谢大家的帮助

最近在学驱动 和 加密和解密
大熊猫侯佩 2007-08-29
  • 打赏
  • 举报
回复
问题解决了么?
speeches 2007-08-29
  • 打赏
  • 举报
回复
?
大熊猫侯佩 2007-08-12
  • 打赏
  • 举报
回复
so?
czlyc006 2007-08-12
  • 打赏
  • 举报
回复
LZ的意思是…?

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧