首页   |   IT资讯   |   综合资讯   |   开发   |   软件   |   问答   |   网络技术   |   网络综合
更多:
当前位置:首页 » 手机数码
文章正文

四次构造五次析构!!!

类型:转载   责任编辑: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();  
   
  }  
 

推荐阅读

  • 北京通信开打网费价格战目光瞄向窄带拨号市场 [详细内容]
  • 请神容易送神难--西门子2118的短信删除 [详细内容]
  • 贴身温柔:妙趣横生的本本冬季使用装备 [详细内容]
  • 市场变动精明眼 11月主流MP3降价排行 [详细内容]
  • 价格战打飞了谁的“裤头”? [详细内容]
  • 打造个性MP3产品 多彩触控式626B试用 [详细内容]
  • 焦点是我了!夏普4款彩色数码复合机 [详细内容]
  • 网友回答:
    网友:zfive5

    看了它,全明白:  
      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  
     

    网友:syw2002

    原因在这:  
      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();  
       
      }  
     

    网友:mtsh

    同意楼上!我的研究结果源代码如下:  
      #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();  
       
      }  
       
     

    .
      最佳浏览:1024X768 MSIE
    ©2007 jqmk.com.cn All Rights Reserved