1.1构造函数体赋值
在创建对象时,编译器要调用构造函数,给对象中各个变量进行赋值。
class Date
{
public:
Date(int year, int month, int day)
{
this->_year = year;
this->_month = month;
this->_day = day;
}
private:
int _year;
int _month;
int _day;
};
虽然说上述构造函数调用后,对象中已经有一个初值,但是这并不能称为对对象中成员变量的初始化。构造函数中的的语句只能被称为赋初值,而不是初始化。初始化只能进行一次,而赋值可以进行很多次。
1.2初始化列表的使用
初始化列表:以一个冒号开始,接着是一个以逗号分离的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。
class Date
{
public:
Date(int year, int month, int day)
:_year(year)
, _month(month)
, _day(day)
{}
private:
int _year;
int _month;
int _day;
};
注意事项:
1.每个成员变量在初始化列表只能初始化一次。
2.类中包含引用成员变量,const成员变量,自定义类型成员(且该类没有默认构造函数)必须使用初始化列表。
class A
{
public:
A(int a)
:_a(a)
{}
private:
int _a;
};
class B
{
public:
B(int a,int ref)
:tmp(a)
,_ref(ref)
,_n(5)
{}
private:
A tmp;//没有默认构造函数
int& _ref;//引用
const int _n;//const常量
};
3.尽量使用舒适化列表初始化,因为不管你是否使用初始化列表,对于自定义类型成员变量,一定会优先使用初始列表初始化。
class Time
{
public:
Time(int day=0)
:_day(day)
{
cout << "Time()" << endl;
}
private:
int _day;
};
class Test
{
public:
Test(int num)
{}
private:
int _num;
Time t;
};
int main()
{
Test m(1);
}
4.成员变量在类中的声明次序就是在其初始化列表的初始化顺序,与其在初始化列表中的先后顺序不同。
class A
{
public:
A(int a)
:_a2(a)
,_a1(_a2)
{}
void print()
{
cout << _a1 << " " << _a2 << endl;
}
private:
int _a1;
int _a2;
};
int main()
{
A m(1);
m.print();
}//一道笔试题
A.输出1 1
B.程序崩溃
C.编译不通过
D.随机值 1