初始化与清除:
1.在c++中,初始化太重要了,所以不能留给用户来完成。类的设计者可以通过提供一个叫构造函数的特殊函数来保证每个对象都正确初始化。如果一个类有了构造函数,编译器在创建对象时就自动调用这一函数,这一切都是在用户使用他们的对象之前就已经完成了。
Class X{
int a;
public:
x();//构造函数
};
int main()
{
X a;
}
这时就好像a是一个整数一样:为这个对象分配内存。但是当程序执行到a的定义点时,构造函数自动被调用,以为编译器已悄悄在a的定义点处插入了一个X::X()的调用。
构造函数和析构函数是两个非常特殊的函数:他们没有返回值,这与返回值为void是显然不同的。在程序中创建和消除一个对象的行为非常特殊,就像出生和死亡,而且总是由编译器来调用这些函数以保证他们被执行,如果它们有返回值,要么编译器必须知道如何处理返回值,要么就只能由用户自己显示的调用构造函数与析构函数,这样一来,安全性就被破坏了。
2.当对象超出它的定义范围时,编译器自动调用析构函数,我们可以看袄,在对象的定义点处,构造函数被调用,但是析构函数调用的唯一根据是包含该对象的右括号,即使使用goto语句跳出这一程序块。
#include <iostream>
using namespace std;
class tree
{
int height;
public:
tree(int initialHeight);
~tree();
void grow(int years);
void printsize();
};
tree::tree(int initialHeight)
{
height = initialHeight;
}
tree::~tree()
{
cout<<"inside tree destructor"<<endl;
printsize();
}
void tree::grow(int years)
{
height += years;
}
void tree::printsize()
{
cout<<"tree height is: "<<height<<endl;
}
int main(void)
{
cout<<"before opning brace"<<endl;
{
tree t(12);
cout<<"after tree creation"<<endl;
t.printsize();
t.grow(4);
cout<<"before closing brace"<<endl; //析构函数在右括号处被调用
}
cout<<"after closing brace"<<endl;
return 0;
}
运行结果:
before opning brace
after tree creation
tree height is: 12
before closing brace
inside tree destructor
tree height is: 16 //析构函数在右括号处被调用
after closing brace
Press any key to continue
3.集合初始化
Class X
{
int i,j;
public:
X(int I,int J)
{
i = I;
j = J;
}
};
int main()
{
X xx[] = {X(1,2),X(3,4),X(5,6),X(7,8)};
}