一.作用
为了解决给对象成员初始化赋值的问题。
class Date
{
public:
Date(int year = 0, int month = 1, int day = 1)// 构造函数
{
_year = year;
_month = month;
_day = day;
}
void Print()
{
cout << _year << "年" << _month << "月" << _day << "日" << endl;
}
private:
int _year;
int _month;
int _day;
};
二.构造函数的特性:
1.构造函数的名称,与类名一样。
2.它没有返回值,不代表它的返回类型是void
3.构造函数是建立对象时由系统自动执行的,而且只执行一次。
4.默认构造函数,且默认构造函数只有一个
默认构造函数:
1、我们不写,编译器自动生成的构造函数。
2、我们自己写的无参的构造函数。
3、我们自己写的全缺省的构造函数。
三.构造函数的重载
在一个类中可以定义多个构造函数,以便对类对象提供不同的初始化的方法,供用户选用。
重载方法:构造函数的名称相同,参数不同。
#include <iostream>
using namespace std;
class Date
{
public:
Date()
{
cout << "调用无参的构造函数,设置为默认值" << endl;
_year = 2024;
_month = 5;
_day = 7;
}
Date(int year,int month)
{
_year = year;
_month = month;
_day = 8;
}
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;
};
int main()
{
Date d1(2024,5,9); // 编译器将调用自动生成的默认构造函数对d1进行初始化
d1.Print();
Date d2(2024, 5);
d2.Print();
Date d3; //不能写成Date d3();
d3.Print();
return 0;
}
系统是怎么知道我们会调用哪一个构造函数的?
编译系统是根据函数调用的形式去确定对应的函数。eg:Date d1(2024,5,9); 构造d1有3个参数,那么就调用对应参数类型和参数个数的构函数是:Date(int year, int month, int day )。
四.初始化列表
适用范围:初始化 const 成员、引用成员、自定义类型但是没有默认构造
它与构造函数中的赋值有差别:
1.初始化列表是在对象创建时直接初始化成员变量。
2.构造函数中的赋值是在对象创建后对已经初始化的成员变量进行赋值。
好处:初始化列表可以避免产生临时对象和多余的拷贝操作,提高效率。