派生類不能直接訪問基類的私有成員,而必須通過基類方法進行訪問。
具體來說,派生類構造函數必須使用基類構造函數。
創建派生類對象時,程序首先創建基類對象。C++使用初始化列表完成這項工作。
RatedPlayer::RatedPlayer(int r, const string &fn):TableTennisPlayer(fn)
{
rating = r;
}
其中TableTennisPlayer(fn)是成員初始化列表,它是可執行代碼。調用TableTennisPlayer構造函數。
如果不使用初始化列表,則調用基類默認構造函數。
同樣,可以對派生類成員使用成員初始化列表語法:
RatedPlayer::RatedPlayer(int r, const string &fn):TableTennisPlayer(fn),rating(r)
{
}
有關派生類構造函數的要點:
1創建基類對象。
2派生類構造函數應通過成員初始化列表將基類信息傳遞給基類構造函數。
3派生類構造函數應初始化派生類新增的數據成員。
Effective C++中寫到“Make sure that objects are initialized before they’re used.”,即“確定對象被使用前已先被初始化”。
下面不討論繼承,只討論賦值和初始化!有代碼如下
ABEntry::ABEntry(const std::string & name)
{
theName = name;
}
C++規定,對象的成員變量的初始化動作發生在進入構造函數本體之前。
因此,上訴代碼中theName不是初始化而是賦值。即,首先調用了這個類的默認構造函數,然後將theName賦值為name,即在調用拷貝構造函數。
將上訴代碼改為:
ABEntry::ABEntry(const std::string & name): theName(name)
{
}
則只調用了默認構造函數,不會再調用拷貝構造函數。
因此,使用成員初始化列表,程序的效率越高!!