close

原文:
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中會初始化為空字串。

arrow
arrow
    文章標籤
    C++
    全站熱搜

    coherence 發表在 痞客邦 留言(0) 人氣()