想实现输入两个值,经过一个函数什么都不改变,然后,输出出来,但发现,中间竟然把原来输入进去的值给改变了!让我一顿好找。。。。。。。
初始化变量与函数生命周期的关系
错误代码:
#include <iostream>
using namespace std;
class Location
{
public:
Location(int xx = 0, int yy = 0)
{
int X = xx;
int Y = yy;
cout << "Constructor Object.\n" << endl;
}
~Location()
{
cout << X << "," << Y << " Object destroyed." << endl;
}
int GetX()
{
return X;
}
int GetY()
{
return Y;
}
private: int X, Y;
};
void main()
{
cout << "输入前X值:1, 输入前Y值:2" << endl;
Location a(1, 2);
cout << "经过函数后, 对应的X值:" << a.GetX() <<"\n" << endl;
cout << "经过函数后,对应的Y值:" << a.GetY() << "\n" << endl;
cout << "hello..." << endl;
system("pause");
return;
}
运行如下:
然后,就百思不得其解,后来,再折腾了很多时间后,总算发现问题了,在定义构造函数的时候:
Location(int xx = 0, int yy = 0)
{
int X = xx;
int Y = yy;
cout << "Constructor Object.\n" << endl;
}
会发现:"int X = xx;",这句话,就决定了悲剧的发生,对于编译器而言,这句话分成下面几步执行:第一步,创建一个类型为int类型的变量;第二步,将xx的值赋给X。那么本来这是平淡无奇的,关键就关键在,这个语句定义在了构造函数内部,当在构造函数内部时,X,Y被定义出来了,并且赋值成功,当构造函数运行完毕之后,X,Y所占据的内存空间也将被析构,所以,再通过外部去访问X,Y的时候,就会出现里面是乱码了!
该怎么改呢?简单到不能再简单了,只要把int变量符号去掉就行了:
Location(int xx = 0, int yy = 0)
{
X = xx;
Y = yy;
cout << "Constructor Object.\n" << endl;
}
运行结果如下:
这样就好了!
析构函数的执行时机
当我执行这段程序的时候,发现析构函数是在我按下任意键之后,才执行的,经过查找得到这样一个结论:只有当类的某个实例化对象的构造函数执行完毕,而且当该对象退出作用域时,才会执行析构函数。而本段程序对应的作用域是std,那么就是当退出主调函数的时候,才会执行。