标签:
1 class TableTennisPlayer 2 { 3 private: 4 string firstname; 5 string lastname; 6 bool hasTable; 7 public: 8 TableTennisPlayer(const string & fn = "none", 9 const string & ln = "none", bool ht = false); 10 .... 11 }
第一种,在函数体内初始化成员
1 TableTennisPlayer::TableTennisPlayer(const string & fn, 2 const string & ln, bool ht) 3 { 4 firstname = fn; 5 lastname = ln; 6 hasTable = ht; 7 }
第二种,使用成员初始化列表语法
1 TableTennisPlayer::TableTennisPlayer(const string & fn, 2 const string & ln, bool ht) : firstname(fn), 3 lastname(ln), hasTable(ht) { }
第一种方法首先为firstname调用string的默认构造函数,在调用string的复制运算符将firstname设置为fn。但是,初始化列表语法(第二种方法)会直接使用string的复制构造函数将firstname初始化为fn。很明显,初始化列表语法步骤少性能好,而且更简洁。
需要在继承特征中添加什么呢?
1,派生类需要自己的构造函数。
2,派生类可以根据需要添加额外的数据成员和成员函数。
构造函数:访问权限的考虑
派生类不能直接访问基类的私有成员,而必须通过基类方法进行访问。也就是说,要想访问修改基类的私有成员,必须要通过派生类的对象调用方法。现在假设,我们要通过派生类的构造函数初始化基类的私有数据成员和派生类数据成员。有点像这样:(假设RatedPlayer是TableTennisPlayer的派生类)
1 RatedPlayer::RatedPlayer(const string & fn, const string & ln, 2 bool ht, unsigned int ra) 3 { 4 firstname = fn; 5 lastname = ln; 6 hasTable = ht; 7 rating = ra; 8 }
问题是,这么做是不行的。因为派生类的构造函数没有访问修改基类的权限。这个时候,前面说的成语初始化列表语法就派上用场了!下面直接看正确用法
1 RatedPlayer::RatedPlayer(const string & fn, const string & ln, 2 bool ht, unsigned int ra) : TableTennisPlayer(fn, ln, ht) 3 { 4 rating = ra; 5 }
创建派生类对象时,程序首先创建基类对象!从概念来说,这意味着基类对象应该在程序进入派生类构造函数之前就被创建。在这儿,初始化成员列表语法就是使基类对象被优先创建!!!
总结来讲,派生类构造函数的要点如下:
1,首先创建基类对象。
2,派生类构造函数应该通过成员初始化列表语法将基类信息传递给基类构造函数,从而优先创建基类对象。
3,派生类构造函数应初始化派生类新增的数据成员。
标签:
原文地址:http://www.cnblogs.com/busui/p/5800447.html