一 类的成员变量有两种初始化方式:
1.初始话列表
2.构造函数体内进行赋值
但是尽量使用初始化列表进行初始化,因为它更高效,为什么更高效呢?
#include<iostream>
using namespace std;
class Time
{
public:
Time()
{
cout << "Time()" << endl;
}
Time&operator=(const Time&t)
{
if (this != &t)
{
cout << "Time&operator=(const Time&t)" << endl;
return *this;
}
}
public:
int _hour;
};
class Date
{
public:
Date(int year = 1900, int month = 1, int day = 1, int hour = 0)
:_year(year)
, _month(month)
, _day(day)
{
_t._hour = hour;
cout << "Date(int year = 1900, int month = 1, int Day = 1, int hour = 0)" << endl;
}
private:
int _year;
int _month;
int _day;
Time _t;
};
int main()
{
Date d1;
system("pause");
return 0;
}
附上代码如下
#include<iostream>
using namespace std;
class Time
{
public:
Time()
{
cout << "Time()" << endl;
}
Time(const Time&t)
{
cout << "Time(const Time&t)" << endl;
}
Time&operator=(const Time&t)
{
if (this != &t)
{
cout << "Time&operator=(const Time&t)" << endl;
return *this;
}
}
private:
int _hour;
};
class Date
{
public:
/*Date(int year, int month , int day , const Time& t)
:_year(year)
, _month(month)
, _day(day)
, _t(t)
{
cout << "Date(int year = 1900, int month = 1, int Day = 1, int hour = 0)" << endl;
}*/
Date(int year, int month, int day, const Time& t)
{
_year = year;
_month = month;
_day = day;
_t = t;
cout << "Date(int year = 1900, int month = 1, int Day = 1, int hour = 0)" << endl;
}
private:
int _year;
int _month;
int _day;
Time _t;
};
int main()
{
Time t;
Date d1(2017,1,9,t);
system("pause");
return 0;
}
二 必须在初始化列表初始化的成员变量
1 常量成员变量(const修饰常量创建时必须初始化)
2 引用类型成员变量(引用创建时必须初始化)
3 没有缺省构造函数的类成员变量
给出代码,读者自行测试
#include<iostream>
using namespace std;
class Time
{
public:
Time(int hour)
{
cout << "Time()" << endl;
}
Time(const Time&t)
{
cout << "Time(const Time&t)" << endl;
}
Time&operator=(const Time&t)
{
if (this != &t)
{
cout << "Time&operator=(const Time&t)" << endl;
return *this;
}
}
private:
int _hour;
};
class Date
{
public:
/*Date(int year, int month , int day , const Time& t)
:_year(year)
, _month(month)
, _day(day)
, _t(t)
{
cout << "Date(int year = 1900, int month = 1, int Day = 1, int hour = 0)" << endl;
}*/
Date(int year, int month, int day, const Time& t, const int& constdate, int& a)
:_t(t)//没有缺省构造函数的类成员变量
,_constdate(constdate)
, _a(a)//引用类型成员变量必须放初始化列表初始化
{
_year = year;
_month = month;
_day = day;
_t = t;
//:_constdate(constdate) 错误 const修饰的成员变量必须放初始化列表初始化
cout << "Date(int year = 1900, int month = 1, int Day = 1, int hour = 0)" << endl;
}
private:
int _year;
int _month;
int _day;
Time _t;
const int _constdate;
int& _a;
};
int main()
{
Time t(10);
int a=2;
Date d1(2017,1,9,t,4,a);
system("pause");
return 0;
}
三 成员变量按声明顺序依次初始化,而非初始化列表出现的顺序
#include<iostream>
using namespace std;
class Date
{
public:
Date(int x)
:_day(x)
, _month(_day)
, _year(_month)
{
cout << "Date(int x)" << endl;
}
void Display()
{
cout << "year "<< _year << endl;
cout << "month "<< _year << endl;
cout << "day "<< _year << endl;
}
private:
int _year;
int _month;
int _day;
};
int main()
{
Date d1(1);
d1.Display();
system("pause");
return 0;
}
最后的最后再说一句,本篇讲述的是构造函数的初始化方式,拷贝构造也属于构造,因此是相同的。