C++构造函数在给对象的成员变量进行赋值时,有两种方法一种构造函数体赋值,另一种初始化列表。 同时对象在经过构造函数体赋值后,虽然会有一个初始值,当这种不能够叫对象成员变量的初始化,是由于在构造函数体中可以多次改变成员变量的值,而初始化是指成员变量只能初始化一次。两者方法如下程序所示。同时构造函数初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。
class Date
{
public:
//两个构造函数任选一个
Date(int year, int month, int day)//构造函数体赋值
{
_year = year;
_month = month;
_day = day;
}
Date(int year, int month, int day):_year(year),_month(month),_day(day)//初始化列表
{
}
private:
int _year;
int _month;
int _day;
};
有了构造函数体赋值我们为什么还要使用构造函数的初始化列表呢,这是因为我们的类中有一下以下成员变量,必须放在初始化列表位置进行初始化。如1、引用成员变量 2、const 成员变量 3、自定义类型成员(该类没有默认构造函数)。如下程序所示。
class A
{
public:
A(int a)
:_a(a)
{}
private:
int _a;
};
class B
{
public:
B(int a, int ref)
:_aobj(a)
,_ref(ref)
,_n(10)
{}
private:
A _aobj; // 没有默认构造函数
int& _ref; // 引用
const int _n; // const
};
到目前位置我们还没有说明白,构造函数中的构造函数体与初始化列表的不同,它们两个最大的不同是 初始化列表中是对象实例化时,当创建对象同时给对象进行初始化,而函数体是对象的变量创建以后在进行赋值,因此在用函数体给对象的变量进行初始化时,变量已经有了一个随机值,总的来说初始化列表时在对象变量创建时同时赋值进行初始化,而函数体中时对象变量创建后进行赋值,所以我们就解释了为什么const 变量和引用只能在初始化列表来对它们进行初始化,显而易见这些变量要在使用时,只能初始化一次,不能够在改变。如下程序是简单的两种构造函数的不同。
int main()
{
//两种构造函数给成员变量初始化的不同
int p1;
p1 = 0;//函数体中的构造
int p2 = 0;//初始化列表
}