一、定义
构造函数,顾名思义,就是起到构造作用的函数。当我们创建类的一个对象时,会自动调用构造函数。构造函数是对象调用的第一个函数,它不需要用户显式调用,也不能由用户显式调用,只会在对象创建时执行。
二、作用
确保每个对象的所有数据成员都有一个明显的初始值(sensible initial value)。
三、特性及相关代码的演示
构造函数是特殊的成员函数,需要注意的是,构造函数的虽然名称叫构造,但是需要注意的是构造函数的主要任务并不是开空间创建对象,而是初始化对象。
其特征如下:
- 函数名与类名相同。
- 无返回值。
- 对象实例化时编译器自动调用对应的构造函数。
- 构造函数可以重载。
- 如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显式定义编译器将不再生成
验证代码
class date {
public:
//1.无参构造函数
date() {
_year = 1111;
_month = 2;
_day = 2;
}
//2.带参构造函数
date(int year, int month, int day) {
_year = year;
_month = month;
_day = day;
}
//3.若是没有显式定义构造函数,则编译器自动生成
//若是显式定义了构造函数,编译器不再生成默认构造函数
//3.重载构造函数
date(float a) {
}
void display() {
cout << _year << " " << _month << " " << _day << endl;
}
private:
int _year;
int _month;
int _day;
};
void test1() {
date d1;//调用无参构造函数
d1.display();
date d3();
//注意:通过无参构造函数创建对象时,对象后面不用跟括号,否则就成了函数声明
//声明d3函数,该函数无参,返回一个日期类型的对象
date d2(2020, 6, 1);
d2.display();
}
6.无参的构造函数和全缺省的构造函数都称为默认构造函数,并且默认构造函数只能有一个。注意:无参构造函数、全缺省构造函数、我们没写编译器默认生成的构造函数,都可以认为是默认成员函数
所以,这三种只能有一种存在
// 默认构造函数
//像下面这种的类,就会因为Date中包含多个默认构造参数而无法通过编译
class Date
{
public:
Date()
{
_year = 1900;
_month = 1;
_day = 1;
}
Date(int year = 1, int month = 1, int day = 1)
{
_year = year;
_month = month;
_day = day;
}
private:
int _year;
int _month;
int _day;
};
void Test()
{
Date d1;
}
- 关于编译器生成的默认成员函数,很多童鞋会有疑惑:在我们不实现构造函数的情况下,编译器会生成默认的构造函数。但是看起来默认构造函数又没什么用?d对象调用了编译器生成的默认构造函数,但是d对象year/month/_day,依旧是随机值。也就说在这里编译器生成的默认构造函数并没有什么卵用??
解答:C++把类型分成内置类型(基本类型)和自定义类型。内置类型就是语法已经定义好的类型:如int/char…,自定义类型就是我们使用class/struct/union自己定义的类型,看看下面的程序,就会发现编译器生成默认的构造函数会对自定类型成员_t调用的它的默认成员函数
class time {
public:
private:
int hour;
int minute;
int second;
};
class Date
{
public:
Date()
{
_year = 1900;
_month = 1;
_day = 1;
}
Date(int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
}
void print() {
cout << _year << " " << _month << " " << _day << " " << endl;
}
private:
int _year;
int _month;
int _day;
time _t;
};
void test2() {
Date d1;
}