很多时候我们希望在创建一个类对象的同时能够给它的数据成员赋初值,因为类的数据成员是不能在声明的时候赋初值的,所以一种方法是可以通过定义成员函数来给数据成员赋初值,但有时候我们可能会忘记去调用这个函数,因此能不能建立一种机制,让系统自动调用赋初值的函数呢?
这就引出了构造函数。
C++提供了构造函数来处理对象的初始化。构造函数是一种特殊的成员函数,与其他成员函数不同,不需要用户来调用它,而是在建立对象时自动执行。
注意:
构造函数的名字必须与类名同名,而不能由用户任意命名,以便编译系统能识别它并把它作为构造函数处理。
它不具有任何类型,不返回任何值。
构造函数的功能是由用户定义的,用户根据初始化的要求设计函数体和函数参数。
如果用户自己没有定义构造函数,则C++系统会自动生成一个构造函数,只是这个构造函数的函数体是空的,也没有参数,不执行初始化操作。
构造函数根据参数的情况,可以分成不带参数的默认构造函数、带参数的构造函数和传引用的构造函数,还有一种参数初始化列表的形式,下面我们一一来看。
我们首先来定义一个类作为例子:
class Point
{
double x,y;
public:
Point();
};
这个Point类的私有数据成员有x和y,成员函数只有Point,你发现这个成员函数连函数类型都没有声明,而且函数名和类名一样,嗯,对,这就是构造函数,而且是没有参数的默认构造函数。
我们在类外定义这个默认构造函数:
Point::Point()
{
x=0;
y=0;
}
这样,我们在定义新一个类对象的时候,系统就会自动调用这个函数给x和y赋初值。
下面我们来看带参数的。
还是我们的Point类,直接看代码:
class Point
{
double x,y;
public:
Point(double x_value,double y_value);
};
可以看到类声明的时候就带上了参数,然后看类外定义这个带参数的构造函数:
Point::Point(double x_value,double y_value)
{
x=x_value;
y=y_value;
}
我们在类声明的时候和不带参数的默认构造函数是一样的:
class Point
{
double x,y;
public:
Point();
};
但在定义的时候更加简洁方便:
Point::Point():x(0),y(0){}
其中的{}内仍然可以写语句,可以执行。但就赋初值的功能来看,写成这样就可以了。
我们在类声明的时候和带参数的构造函数是一样的:
class Point
{
double x,y;
public:
Point(double x_value,double y_value);
};
但在定义的时候更加简洁方便:
Point::Point(double x_value,double y_value):x(x_value),y(y_value){}
依然,{}内仍然可以写语句,可以执行。但就赋初值的功能来看,写成这样就可以了。
传引用的构造函数实际上是拷贝构造函数,里面涉及深拷贝和浅拷贝,我们下期再聊这个。