中国大学MOOC程序设计与算法(三):C++ 面向对象程序设计 第二周 类和类的对象基础 笔记 之 构造函数析构函数调用时机

第二周 类和类的对象基础
1.类和对象的基本概念(2)
2.构造函数
3.复制构造函数
4.类型转换构造函数和析构函数
5.构造函数析构函数调用时机

5.构造函数析构函数调用时机

例子:

class Demo {
	int id;
public:
	Demo(int i)  {
		id = i;
		cout << "id=" << id << " constructed" << endl;
	}
	~Demo() {
		cout << "id=" << id << " destructed" << endl;
	}
};
Demo d1(1);
void Func()
{
	static Demo d2(2);//静态局部变量在出了局部后还是存在的,程序结束的时候才会消失
	Demo d3(3);
	cout << "func" << endl;
}
int main () {
	Demo d4(4);
	d4 = 6;//类型转换构造函数会生成一个临时对象,然后被销毁,因此需要先后调用构造函数和析构函数
	cout << "main" << endl;
	{ 
		Demo d5(5);//注意这是个局部对象,出了局部就要被销毁
	}
	Func();
	cout << "main ends" << endl;
	return 0;
}

输出结果: :
id=1 constructed  //Demo d1(1);
id=4 constructed  //Demo d4(4);
id=6 constructed  //d4 = 6;
id=6 destructed  //d4 = 6;
main
id=5 constructed  //Demo d5(5);
id=5 destructed  //Demo d5(5);
id=2 constructed  //static Demo d2(2);
id=3 constructed  //Demo d3(3);
func
id=3 destructed  //出了void Func()
main ends
id=6 destructed  //  Demo d4(4)消失
id=2 destructed  //程序结束,静态局部变量消失
id=1 destructed  //程序结束,全局变量消失,比d2先构造,要比它后析构,因为栈

注意:A * p2 = new A;//new出来的对象,只有delete时才会调用析构函数,没有delete的话即使程序结束也不会调用析构函数,因为p2只是个指针,不是对象。

复制构造函数在不同编译器中的表现

class A {
	public:
		int x;
		A(int x_):x(x_){ 
			cout << x << " constructor called" << endl; 
		}
		A(const A & a ) { // 本例中dev 需要此const 其他编译器不要
			x = 2 + a.x;
			cout << "copy called" << endl;
		}
		~A() { 
			cout << x << " destructor called" << endl; 
		}
};
A f( ){  
	A b(10); 
	return b; 
}
int main( ){
	A a(1);
	a = f();
	return 0;
}
Visual Studio输出结果:
1 constructor called
10 constructor called
copy called
10 destructor called
12 destructor called
12 destructor called
dev C++输出结果:
1 constructor called
10 constructor called
10 destructor called
10 destructor called
说明:dev出于优化目的并未生成返回值临时对象。VS无此问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值