前言
在定义对象的时候进行的数据成员设置,成为对象的初始化。在特定对象使用结束时,还经常需要进行一些清理工作。C++ 程序中的初始化和清理工作,分别由两个特殊的成员函数来完成,它们就是构造函数和析构函数
一、构造函数
1.基本定义
C++编译系统在对象初始化的问题上,严格规定了初始化程序的接口形式,并由一套自动的调用机制,这里所说的初始化程序就是构造函数。
构造函数的作用就是在对象被创建时利用特定的值构造对象,将对象初始化为一个特定的状态。 构造函数也是类的一个成员函数,除了具有一般成员函数的特征之外,还有一些特殊的性质:构造函数的函数名与类名相同,而且没有返回值;构造函数通常被声明为公有函数。构造函数在对象被创建的时候将被自动调用。
调用时无须提供参数的构造函数称为默认构造函数,如下所示:
class circle {
public:
circle() {}//编译系统生成的隐含的默认构造函数
};
也可以定义恰当的构造函数,circle类的对象在建立时就能获得一个初始的值,如下所示:
public:
circle(double r) {
this->r = r;
}
double getRadir() {
return this->r;
}
private:
double r;
};
完整代码如下:
#include <iostream>
using namespace std;
class circle {
public:
circle(double r) {
this->r = r;
}
double getRadir() {
return this->r;
}
private:
double r;
};
int main()
{
circle cir(3);
cout << cir.getRadir() << endl;
return 0;
}
2.复制构造函数
复制构造函数是一种特殊的构造函数,具有一般构造函数的所有特性,其形参是本类的对象的引用。其作用是使用一个已经存在的对象(由复制构造函数的参数指定),去初始化同类的一个新对象。
程序员可以根据实际问题的需要定义特定的复制构造函数,以实现同类对象之间数据成员的传递。如果程序员没有定义类的复制构造函数,系统就会在必要时自动生成一个隐含的复制构造函数。**这个隐含的复制构造函数的功能是,把初始化对象的每个数据成员的值都复制到新建立的对象中。**如下所示:
#include <iostream>
using namespace std;
class circle {
public:
circle(double r) {
this->r = r;
}
circle(circle &cir);
double getRadir() {
return this->r;
}
private:
double r;
};
int main()
{
circle cir(3);
circle c(cir);
cout << cir.getRadir() << endl;
cout << c.getRadir() << endl;
return 0;
}
circle::circle(circle& cir){
r = cir.r;
}
普通构造函数是在对象被创建时调用,而复制构造函数在以下三种情况下会被调用:
1)当用一个类去初始化该类的另一个对象时;
2)如果函数的形参时类的对象,调用函数时,进行形参和实参结合时;
3)如果函数的返回值是类的对象,函数执行完成返回调用值时。
二、析构函数
析构函数与构造函数的作用几乎正好相反,它用来完成对象被删除前的一些清理工作,也就是专门做扫尾工作的。析构函数实在对象的生存期即将结束的时刻被自动调用的。
与析构函数一样,析构函数通常也是类的一个公有函数成员,它的名称是由类名前面加“~”构成,没有返回值。和析构函数不同的是析构函数不接收任何参数,但可以是虚函数。
class circle {
public:
circle(double r) {
this->r = r;
}
circle(circle &cir);
double getRadir() {
return this->r;
}
~circle(){}//析构函数
private:
double r;
};