#include<iostream.h>
class A
{
public:
A(int i=0){m=i;cout<<"constructor called."<<m<<"\n";}
void Set(int i){m=i;}
void Print()const{cout<<m<<endl;}
~A(){cout<<"destructor called."<<m<<"\n";}
private:
int m;
};
void main()
{
const N=5;
A my;
my=N;   //这儿直接赋值是怎么回事?
my.Print();
} 运行结果:
constructor called.0
constructor called.5    
destructor called.5    //这个析构函数对应哪个?构造函数?
5
destructor called.5    //为什么这儿的析构和构造的内容不对应?

解决方案 »

  1.   

    N被隐式转换为A的实例了
    my=N;   //这儿直接赋值是怎么回事?
    相当于:
             {
                A temp(N)
       my=temp;
              }//此处temp超出作用范围
    所以先构造 my,然后构造temp
    先析构temp,然后析构A
      

  2.   

    是创建了两个实例
    而且将第二个实例的值赋给给了第一个实例
    所以第一个实例的m该变了.
    my=temp
    执行时相当于
    my.m=temp.m;
      

  3.   

    看看产生的汇编代码; 19   :  my=N;   //这儿直接赋值是怎么回事? push OFFSET FLAT:??_C@_01BJG@?6?$AA@ ; `string'
    push 5
    push OFFSET FLAT:??_C@_0BE@DHAP@constructor?5called?4?$AA@ ; `string'
    mov ecx, OFFSET FLAT:?cout@@3Vostream_withassign@@A
    mov DWORD PTR __$EHRec$[esp+36], 0
    call ??6ostream@@QAEAAV0@PBD@Z ; ostream::operator<<
    mov ecx, eax
    call ??6ostream@@QAEAAV0@H@Z ; ostream::operator<<
    mov ecx, eax
    call ??6ostream@@QAEAAV0@PBD@Z ; ostream::operator<<
    push OFFSET FLAT:??_C@_01BJG@?6?$AA@ ; `string'
    push 5
    push OFFSET FLAT:??_C@_0BD@FOCD@destructor?5called?4?$AA@ ; `string'
    mov ecx, OFFSET FLAT:?cout@@3Vostream_withassign@@A
    mov DWORD PTR _my$[esp+28], 5
    call ??6ostream@@QAEAAV0@PBD@Z ; ostream::operator<<
    mov ecx, eax
    call ??6ostream@@QAEAAV0@H@Z ; ostream::operator<<
    mov ecx, eax
    call ??6ostream@@QAEAAV0@PBD@Z ; ostream::operator<<
      

  4.   

    上面是做了inline优化的结果
    关闭优化的汇编代码如下; 19   :  my=N;   //这儿直接赋值是怎么回事? push 5
    lea ecx, DWORD PTR $T1340[ebp]
    call ??0A@@QAE@H@Z ; A::A
    mov eax, DWORD PTR $T1340[ebp]
    mov DWORD PTR _my$[ebp], eax
    lea ecx, DWORD PTR $T1340[ebp]
    call ??1A@@QAE@XZ ; A::~A
      

  5.   

    谢谢指点,C++ is amazing! 类的创建方式,以及赋值方式真是千奇百怪。