C++成员初始化列表语法
C++成员初始化列表语法
1.如TableTennisPlayer类有三个私有的成员变量
class TableTennisPlayer {
private:
string firstname;
string lastname;
string hasTable;
}
在其构造函数中可以利用成员初始化列表进行初始化
TableTennisPlayer::TableTennisPlayer(const string &fn, const string &ln, bool ht):firstname(fn), lastname(ln), hasTable(ht) {}
在类的调用中可以,通过直接传参的方式,对私有成员进行初始化。
TableTennisPlayer player1("chuck", "bizzard", true);
2.派生类不能直接访问基类的私有成员,而必须通过基类方法进行访问。例如派生类RatedPlayer构造函数不能直接设置继承的成员(firstname, lastname和hasTable),而必须使用基类的公有方法来访问私有的基类成员。具体地说,派生类构造函数必须使用基类构造函数。
创建派生类对象时,程序首先创建基类对象。从概念上说,这意味着基类对象应当在程序进入派生类构造函数之前被创建。C++使用成员初始化列表语法来完成这种工作。例如,下面是第一个RatedPlayer构造函数的代码:
RatedPlayer::RatedPlayer(unsigned int r, const string &fn, const string &ln, bool ht):TableTennisPlayer(fn, ln, ht)
{
rating = r;
}
其中:TableTennisPlayer(fn, ln, ht)是成员初始化列表,它是可执行的代码,调用TableTennisPlayer构造函数。例如,假设程序包含如下声明:
RatedPlayer rplayer1(1140, “Mallory”, “Duck”, true);
则RatedPlayer构造函数将把实参"Mallory", “Duck"和 true赋给形参fn, ln和ht,然后将这些参数作为实参传递给TableTennisPlayer构造函数,后者将创建一个嵌套TableTennisPlayer对象,并将数据"Mallory”, "Duck"和 true存储在该对象中。然后,程序进入RatedPlayer构造函数体,完成RatedPlayer对象的创建,并将参数r的值(即1140)赋给rating成员。
3.如果省略成员初始化列表,情况将如何呢?
除非要使用默认构造函数,否则应显示调用正确的基类构造函数。
下面来看第二个构造函数的代码:
RatedPlayer::RatedPlayer(unsigned int r, const TableTennisPlayer& tp)
: TableTennisPlayer(tp)
{
rating = r;
}
这里也将TableTennisPlayer的信息传递给了TableTennisPlayer构造函数:TableTennisPlayer(tp)
由于tp的类型为TableTennisPlayer &,因此将调用基类的复制构造函数。
4.如果愿意,也可以对派生类成员使用成员初始化列表语法。在这种情况下,应在列表中使用成员名,而不是类型,所以3中的构造函数可以按照下述方式编写:
RatedPlayer::RatedPlayer(unsigned int r, const TableTennisPlayer& tp)
: TableTennisPlayer(tp),rating®
{
rating = r;
}
小结:
有关派生类构造函数的要求如下:
1.首先创建基类对象;
2.派生类构造函数应通过成员初始化列表将基类信息传递给基类构造函数;
3.派生类构造函数应初始化派生类新增的数据成员。
释放对象的顺序与创建对象的顺序相反,即首先执行派生类的析构函数,然后自动调用基类的析构函数。