什么是构造函数与析构函数?
前面我们说过,在类的定义时,我们不能对成员数据进行初始化。但有时候,我们又需要对成员数据进行初始化,这时候构造函数就派上用场了。构造函数的功能就是在创建对象时,用给定的参数值对类里的数据进行初始化。析构函数会在类的对象的生命周期结束时自动调用,我们可以利用这一特点来做些内存释放的工作。
1.构造函数
构造函数会在对象建立时自动调用,我们一般将变量、对象的初始化代码放在构造函数里。
在C++里,构造函数必须与自己所在的类同名,它可以带参数,也可以不带参数,值得一提的是,尽管构造函数的名字是固定的,必须与与其所在类的名字相同,但构造函数却可以有多个。
示例:
class CMyClass
{
public:
CMyClass(int x)//带参数的构造函数
{
para1 = x;
}
private:
int para1;
};
构造函数既可以带参数,也可以不带参数,既可以带一个参数,也可以带不同的参数,还可以带不同的参数。如上所言,在同一个类里,可以有许多的构造参数。如下所示:
class CMyClass
{
public:
CMyClass(int x)//带参数的构造函数
{
para1 = x;
}
CMyClass(char *s1, char *s2)//带多个参数的构造函数
{
str1 = s1;
str2 = s2;
}
private:
int para1;
char *str1,*str2;
};
特点:
(1).当构造函数重载时,应避免二义性
(2).构造函数没有也不需要指定返回值类型
(3).当类用于定义对象时,构造函数必须为共有型,只有这样类才能示例化,换句话说,只有这样,对象才能用这个类来定义。当这个类只用于派生其他类时,构造函数可定义为保护型成员函数。
1.2 默认构造函数
如果你自己并没有定义构造函数,那么编译会自动隐式生成一个不带参数的默认构造函数,其意义在于满足语法需要,因为我们在生成对象时,通常如下:
CMyClass myClass;//生成对象
只有在类中包含一个
CMyClass()
{ }
方能合法。
在我们自己创造了构造函数之后,默认的构造函数不再存在,
CMyClass myClass;//生成对象
会因为找不到默认的构造函数而出现编译错误,这时需要我们人为地添加一个不带任何参数的构造函数,即显式的默认构造函数,只有这样,上述语句才 不会造成编译错误。
2.析构函数
构造函数有且仅有一个,如果我们不人为添加,则编译会自动生成一个隐式的默认析构函数。
析构函数是在类名称前加一个”~“逻辑非的符号。示例:
class CMyClass
{
//.......
public:
~ CMyClass()//析构函数
{
}
//........
};
特点:
(1)没有任何参数,不返回任何值。
(2)在类的对象调用结束时,析构函数会被自动调用。
根据第二个特点,我们在析构函数的结构体里添加delete函数来释放对象,从而达到清理内存的效果。