1 构造函数
按照上一节讲的,我们如果要初始化数据成员,需要按照下面这样定义一个公有函数。
class Test
{
public:
void InitTest(int d = 1)
{
data = d;
}
private:
int data;
}
void main()
{
Test t;
t.InitTest(100); //结果是100
}
可以看到,我们在类中定义的大多数数据成员都是私有的,一开始定义的数据成员是个随机值。如果要对它们进行初始化,必须用一个公有函数来进行。同时这个函数应该在且仅在定义对象时自动执行一次。称为 构造函数(constructor)。
构造函数是特殊的公有成员函数,其特征如下:
- 函数名与类名相同;
- 构造函数无函数返回类型说明。即什么也不写,也不可写void!实际上构造函数有返回值,返回的就是构造函数所创建的对象;
- 在程序运行时,当新的对象被建立,该对象所属的类的构造函数自动被调用,在该对象生存期中也只调用这一次;
- 构造函数可以重载。严格地讲,说明中可以有多个构造函数,它们由不同的参数表区分,系统在自动调用时按一般函数重载的规则选一个执行。
- 构造函数可以在类中定义,也可以在类外定义;
- 如果类说明中没有给出构造函数,则C++编译器会自动给出一个缺省的构造函数,形如: 类名( ) { }。这也是能够创建对象,进行实例化的原因。但如果定义了任何一个构造函数,系统就不会再给你提供。
-----------------------------------------------------------------------------------------------------------------------------------------
以下是对这些特征进行说明和举栗。
所以我们在初始化私有成员变量时,可以直接在构造函数里写出来,比如上面,直接定义 data = 0,下面三个对象中的私有成员data都是初始化是0。
第4条,当有不同参数时,允许重载,我们举个栗子:
class Test
{
public:
Test()
{
data = 0;
}
Test(int d)
{
data = d;
}
Test(int d, int x, int y)
{
data = d;
this->x = x;
this->y = y;
}
private:
int data;
int x;
int y;
}
void main()
{
Test t1;
Test t2(10);
Test t3(1,2,3);
}
第5条,构造函数与其他公有函数一样,也可以在函数外进行,举个栗子:
//返回值 类名::函数名(参数列表)
Test::Test(int x,int y)
{
this->x = x;
this->y = y;
}
void main()
{
Test t4(10,20);
}
2 析构函数
这个与构造函数是相反的过程,当一个对象定义时,C++自动调用构造函数建立该对象并进行初始化,而当一个对象的生命周期结束时,C++也会自动调用一个函数注销该对象并进行善后工作,这个特殊的成员函数就是析构函数(destructor)。
析构函数的特征如下:
- 析构函数名与类名相同,但在前面加上字符 ~, eg. ~CGoods( );
- 析构函数无函数返回类型,这点与构造函数一样。但析构函数不带任何参数;
- 一个类有且只有一个析构函数,其可以缺省;
- 对象注销时,系统自动调用析构函数。
即人生的不一样,有马爸爸的儿子,盖茨的儿子,贾宝玉…但死的时候任何人都是一样的。