#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 //为什么这儿的析构和构造的内容不对应?
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 //为什么这儿的析构和构造的内容不对应?
解决方案 »
- 为什么找不到程序里指定的ini文件呢?
- 请教一个C/S的问题
- 在VC中能不能操纵Excel进行打印预览的操作阿?
- 为什么我写的dll编译是会出现"mywspdll error LNK2005: _DllMain@12 已经在 mywspdll.obj 中定义"这样的错误
- 简单问题
- 那里有专业的图片网站
- MFC 怎么绘制类似word中的表格?
- XXXXXXXXX____世界IP分配表,想要就进来看看_____XXXXXXXXXXX
- MFC下可用什么得到一个随机数?
- 从具有owner draw属性的listbox中gettext?
- ★★★如何得知PlaySound播放完毕?★★★
- 我的问题,疑问。
my=N; //这儿直接赋值是怎么回事?
相当于:
{
A temp(N)
my=temp;
}//此处temp超出作用范围
所以先构造 my,然后构造temp
先析构temp,然后析构A
而且将第二个实例的值赋给给了第一个实例
所以第一个实例的m该变了.
my=temp
执行时相当于
my.m=temp.m;
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<<
关闭优化的汇编代码如下; 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