-
为什么要使用构造函数?
在C++中部分的成员是私有的,而类的私有的成员变量在类外是不允许访问的,所以这就意味着程序不能直接访问数据成员,而程序只能通过成员函数来访问数据成员,因此需要合适的成员函数,才能将成功将对象初始化。(大家就疑惑了,那直接把成员定义为公有不就可以了吗?其实这才是错误的,这样定义类的成员违背了类的主要初衷数据隐藏) -
声明和定义构造函数
成员变量为私有的要对其进行初始化,必须要用一个共有函数来进行,同时这个函数应该有且仅在定义的对象的时候自动执行一次,这时调用的函数称为构造函数。
构造函数是特殊的成员函数特征如下:
1)函数名与类名相同
2)无返回值(构造函数的原型和函数头都有一个特征,虽然没有返回值,但没有被声明为void型,实际上构造函数没有声明类型)
3)对象构造时系统自动调用相对的构造函数
4)构造函数可以重载
5)构造函数可以在类内定义也可以在类外定义
6)如果在类定义中没有给出构造函数,系统会默认生成一个缺省的构造函数,但只要我们定义了一个构造函数,系统就不会生成缺省的构造函数
7)无参的构造函数和全缺省的构造函数,都认为时缺省的构造函数,且缺省的构造函数只能有一个。
举例一个日期类: -
无参构造函数和带参构造函数
class Date
{
public:
Date()//无参的构造函数
{}
Date(int year,int month,int day)//带参的构造函数
{
_year=year;
_month=month;
_day=day;
}
private:
int _year;
int _month;
int _day;
};
void TestDate()
{
Date d1;//调用不带参的构造函数
Date d2(2018,9,3);//调用带参的构造函数
}
- 带缺省的构造函数
class Date
{
public:
Date(int year=2018,int month=1,int day=1)//缺省参数的构造函数
{
_year=year;
_month=month;
_day=day;
}
Date(int year,int month)//半缺省的构造函数
{
_year=year;
_month=month;
_day=1;
}
private:
int _year;
int _month;
int _day;
};
void Test()
{
Date d1;//调用缺省构造函数
Date d2(2018,9,3);//调用缺省构造函数
}