关于thinking in c++第11章的错误
#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