第二周 类和类的对象基础
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无此问题