类型:转载 责任编辑:asp 日期:2007/03/01
下面这段代码很简单啊但是结果好奇怪,出现四次构造函数却出现五次析构函数!!!
请高手帮忙看看啊!!!!!
vc6下通过
#include<iostream.h>
class complex
{
float real;
float image;
public:
complex(float r=0,float i=0)
{real=r;image=i;cout<<"calling constructor..."<<endl;}
~complex()
{cout<<"calling disconstructor..."<<endl;}
void show()
{cout<<"real:"<<real<<" "<<"image:"<<image<<endl;}
complex operator+(complex&c)
{
complex t;
t.real=real+c.real;
t.image=image+c.image;
return t;
}
};
void main()
{
complex c1(1,1);
c1.show();
complex c2;
c2.show();
c2=c1+(complex)3;
c2.show();
}
推荐阅读
看了它,全明白:
39: void main()
40: {
004013c0 push ebp
004013c1 mov ebp,esp
004013c3 push 0ffh
004013c5 push offset __ehhandler$_main (00402b4b)
004013ca mov eax,fs:[00000000]
004013d0 push eax
004013d1 mov dword ptr fs:[0],esp
004013d8 sub esp,6ch
004013db push ebx
004013dc push esi
004013dd push edi
004013de lea edi,[ebp-78h]
004013e1 mov ecx,1bh
004013e6 mov eax,0cccccccch
004013eb rep stos dword ptr [edi]
41: complex c1(1,1);
004013ed push 3f800000h
004013f2 push 3f800000h
004013f7 lea ecx,[ebp-14h]
004013fa call @ilt+5(complex::complex) (0040100a)
004013ff mov dword ptr [ebp-4],0
42: c1.show();
00401406 lea ecx,[ebp-14h]
00401409 call @ilt+10(complex::show) (0040100f)
43: complex c2;
0040140e push 0
00401410 push 0
00401412 lea ecx,[ebp-1ch]
00401415 call @ilt+5(complex::complex) (0040100a)
0040141a mov byte ptr [ebp-4],1
44: c2.show();
0040141e lea ecx,[ebp-1ch]
00401421 call @ilt+10(complex::show) (0040100f)
45: c2=c1+(complex)3;
00401426 push 0
00401428 push 40400000h
0040142d lea ecx,[ebp-24h]
00401430 call @ilt+5(complex::complex) (0040100a)
00401435 mov dword ptr [ebp-30h],eax
00401438 mov eax,dword ptr [ebp-30h]
0040143b mov dword ptr [ebp-34h],eax
0040143e mov byte ptr [ebp-4],2
00401442 mov ecx,dword ptr [ebp-34h]
00401445 push ecx
00401446 lea edx,[ebp-2ch]
00401449 push edx
0040144a lea ecx,[ebp-14h]
0040144d call @ilt+20(complex::operator+) (00401019)
00401452 mov dword ptr [ebp-38h],eax
00401455 mov eax,dword ptr [ebp-38h]
00401458 mov ecx,dword ptr [eax]
0040145a mov edx,dword ptr [eax+4]
0040145d mov dword ptr [ebp-1ch],ecx
00401460 mov dword ptr [ebp-18h],edx
00401463 lea ecx,[ebp-2ch]
00401466 call @ilt+0(complex::~complex) (00401005)
0040146b mov byte ptr [ebp-4],1
0040146f lea ecx,[ebp-24h]
00401472 call @ilt+0(complex::~complex) (00401005)
46: c2.show();
00401477 lea ecx,[ebp-1ch]
0040147a call @ilt+10(complex::show) (0040100f)
47: return;
0040147f mov byte ptr [ebp-4],0
00401483 lea ecx,[ebp-1ch]
00401486 call @ilt+0(complex::~complex) (00401005)
0040148b mov dword ptr [ebp-4],0ffffffffh
00401492 lea ecx,[ebp-14h]
00401495 call @ilt+0(complex::~complex) (00401005)
48: }
0040149a mov ecx,dword ptr [ebp-0ch]
0040149d mov dword ptr fs:[0],ecx
004014a4 pop edi
004014a5 pop esi
004014a6 pop ebx
004014a7 add esp,78h
004014aa cmp ebp,esp
004014ac call _chkesp (00401804)
004014b1 mov esp,ebp
004014b3 pop ebp
004014b4 ret
原因在这:
complex operator+(complex&c)
{
complex t;
t.real=real+c.real;
t.image=image+c.image;
return t;
}
这个运算符重载函数的返回值是对象拷贝,而不是对象的引用或地址,所以多出一个析构函数。返回值修改为complex&即可!
修正后的源代码如下:
#include<iostream.h>
class complex
{
float real;
float image;
public:
complex(float r=0,float i=0)
{real=r;image=i;cout<<"calling constructor..."<<endl;}
~complex()
{cout<<"calling disconstructor..."<<endl;}
void show()
{cout<<"real:"<<real<<" "<<"image:"<<image<<endl;}
complex& operator+(complex&c)
{
complex t;
t.real=real+c.real;
t.image=image+c.image;
return t;
}
};
void main()
{
complex c1(1,1);
c1.show();
complex c2;
c2.show();
c2=c1+(complex)3;
c2.show();
}
同意楼上!我的研究结果源代码如下:
#include "stdafx.h"
#include <iostream.h>
class complex
{
float real;
float image;
public:
complex(float r=0,float i=0)
{real=r;image=i;cout<<"("<<real<<","<<image<<")"<<"calling constructor..."<<endl;}
~complex()
{cout<<"("<<real<<","<<image<<")"<<"calling disconstructor..."<<endl;}
void show()
{cout<<real<<" +i*"<<image<<endl;}
complex& operator+(complex& c)
{
complex t;
t.real=this->real+c.real;
t.image=this->image+c.image;
return t;
}
complex& operator=(const complex& c)
{
this->real=c.real;
this->image=c.image;
return *this;
}
};
void main()
{
complex c1(1,1);
c1.show();
complex c2;
c2.show();
// c2=c1+(complex)3;
c2=c1+complex(3);
c2.show();
}