类中成员变量进行初始化
构造方法体内部:并不是对成员变量进行初始化,而是赋值
初始化只能一次,赋值可以多次
构造方法:有初始化列表,初始化列表位置才是真正对成员变量初始化的位置,而构造方法体是赋值
构造函数的初始化列表
Date(int year = 1900, int month = 1, int day = 1)
: _year(year),
_month(month),
_day(day)
#include<iostream>
using namespace std;
class Date
{
public:
Date(int year = 1900, int month = 1, int day = 1)
:_year(year),
_month(month),
_day(day)
, _a(10)
, _rday(day)
{
_year = year;
_month = month;
_day = day;
}
void Print()const
{
cout << _year << "/" << _month << "/" << _day << endl;
}
private:
int _year;
int _month;
int _day;
const int _a;
int& _rday;
};
int main()
{
const int a = 10;
return 0;
}
类中包含以下成员,必须在初始化列表位置进行初始化
引用成员变量
const成员变量
自定义类型成员变量(没有默认构造函数)
Time没有无参的构造方法,Date类无法对_t成员的初始化工作,所以报错
解决方式:将_t的成员放在Date构造方法初始化列表的位置显示初始化
#include<iostream>
using namespace std;
class Time
{
public:
Time(int hour,int minute,int second)
: _hour(hour)
, _minute(minute)
, _second(second)
{
cout << "Time()" << endl;
}
Time(int hour)
: _hour(hour)
, _minute(0)
, _second(0)
{}
private:
int _hour;
int _minute;
int _second;
};
class Date
{
public:
Date(int year, int month, int day)
: _year(year)
, _month(month)
, _day(day)
, _t(10,10,10)
{
cout << "Date(int,int,int)" << endl;
}
Date(int year)
:_year(year)
, _month(1)
, _day(1)
, _t(10)
{}
void Print()const
{
cout << _year << "/" << _month << "/" << _day << endl;
}
private:
int _year;
int _month;
int _day;
Time _t;
};
int main()
{
Date d1(2022, 1, 1);
Date d2(2022);
return 0;
}
1.初始化列表可以不写
如果用户没有显示写出初始化列表,编译器会自动补全
对于类中内置类型成员变量,使用随机值填充
对于类中自定义类型成员变量,调用对应类的无参或者全缺省的构造方法初始化该成员
2.如果类中包含的自定义对象对应的类中没有无参或者全缺省的构造,则报错
解决方法:a.给Time类添加无参或者全缺省的构造方法
b.将Date类初始化类显式给出,然后调用Time类带有参数的构造方法初始化_t