原文:
http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Default_Constructors
若你的class沒有定義ctor時,compiler會自動隱式生成一個default ctor給你;當你的class中有定義data members時,compiler隱式生成的default ctor並不會給予你的data members適當的初值。
class Cls
{
public:
int GetData() const
{
return m_nData;
}
double GetDouble() const
{
return m_dData;
}
private:
int m_nData;
double m_dData;
};
void main()
{
Cls myCls;
std::cout << "Data: " << myCls.GetData() << std::endl;
std::cout << "Double: " << myCls.GetDouble() << std::endl;
}
以上程式碼用MSVC 2005測試,輸出的值為:
Data: -858993460
Double: -9.25596e+061
所以Google C++ Style Guide規定,當你的class中有定義data member而且沒有其它的ctor時,你必須自己定義一個default ctor,並且在這個default ctor中給予你的data member初值。例外是如果你的class繼承自現有的class而且沒有再加入新的data members,那你就不需要自己定義一個default ctor。
用到default ctor的場合如下:
1. Cls myCls;
2. Cls myArray[10];
3. Cls* pMyArray = new Cls[10];
4. std::vector<Cls> vec(10);
值得一提的是,若你class中的data member是其它的class type(比方說是std::string)的話,在你的class建構時會去呼叫該data member的ctor。
class CStudent
{
public:
std::string GetName() const
{
return m_strName;
}
private:
std::string m_strName;
};
void main()
{
CStudent myStudent;
std::cout << "Name: " << myStudent.GetName() << std::endl;
}
以上程式在呼叫CStudent::GetName()時,會得到空字串;因為在建構CStudent myStudent時會呼叫std::string m_strName的ctor,而在std::string的ctor中會初始化為空字串。