构造函数
概念:在每个类中都定义了它的对象被初始化的方式,类通过一个或者几个特殊的成员函数来控制其对象的初始化过 程,这些函数叫做构造函数。
特征:构造函数的名字与类名字相同,构造函数没有返回类型,它有一个(可能为空的)参数列表和一个(可能为空 的)函数体。
注意:构造函数不能被申明成const的。
一个类中可以包含多个构造函数,和其他函数一样,构造函数也可以被重载,但必须在参数的数量或参数的类 型上有所区别。
参数列表:
在函数名的冒号后到函数体的花括号之前的部分我们称之为构造函数的参数列表,它负责为新创建的对象的一 个或者几个数据成员赋初值,构造函数初始值是成员名字的一个列表,每个名字后面紧跟着的括号内的内容即 该成员的初始值。不同的成员的初始化用逗号分隔开。
默认构造函数
概念:当我们创造了一个类,并且没有在其中写入构造函数时,编译器会创造一个默认的构造函数用来初始化对象。
默认构造函数按照以下方法初始化数据成员:
如果成员存在类内的初始值,则用它来初始化该成员。
否则默认初始化该成员,此时变量被赋予默认值,默认值是什么由变量的类型所决定
拷贝构造函数
概念:拷贝构造函数的第一个参数为类对象的引用且其他参数都有默认值,它用于根据一个已存在的对象复制一个新 的该类的对象,一般在函数中会将已存在对象的数据成员的值复制一份到新创建的对象之中。
注意:该构造函数的参数为const且是类对象的引用。之所以使用引用是因为当传参时如果是值传递就会为对象创建一 份临时拷贝,这就会导致无限调用拷贝构造函数,造成死循环。
如果我们没有为一个类定义拷贝构造函数,那么编译器会为我们定义一个。但是与默认构造函数不同,就算我 们定义了自己的拷贝构造函数,编译器也一样会为我们合成一个拷贝构造函数。
代码实现
class Date
{
public:
Date()
{
_year = 2016;
_month = 10;
_day = 1;
}; //构造函数
Date() :_year(2016), _month(10),_day(1){}; //带有初始化列表的构造函数
Date(const Date &today)//拷贝构造函数
{
_year = today._year;
_month = today._month;
_day = today._day;
}
private:
int _year;
int _month;
int _day;
};