初始化变量与函数生命周期的关系及析构函数的执行时机

想实现输入两个值,经过一个函数什么都不改变,然后,输出出来,但发现,中间竟然把原来输入进去的值给改变了!让我一顿好找。。。。。。。

初始化变量与函数生命周期的关系

错误代码:

#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,那么就是当退出主调函数的时候,才会执行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值