閱讀604 返回首頁    go 阿裏雲 go 技術社區[雲棲]


C++編程規範指47.以同樣的順序定義和初始化成員變量

摘要:

   與編譯器一致:成員變量初始化的順序要與類定義中聲明的順序始終保持一致,不用考慮構造函數初始化列表中編寫的順序。要確保構造函數代碼不會導致混淆地指定不同的順序。

考慮以下代碼:

<span >class Employee
{
         string emall_,firstName_, lastName_;
public:
         Employee(const char*firstName, const char* lastName)
                   :firstName_(firstName),lastName_(lastName)
                   ,emall_(firstName_ + "." + lastName_ + "@gmail.com"){}
};</span>


    這段代碼隱藏著一個錯誤,危害性極大,而且很難發現。因為類定義中email_是在first_和last_之前被聲明的,它將首先會被初始化,然後試圖使用其他未初始化的字段。更糟糕的是,如果構造函數的定義位於另一個文件夾,成員變量聲明的順序對構造函數的正確性的遠距離影響就更難確定了。

    C++語言之所以才去這樣的設計,是因為要確保銷毀成員的順序是唯一的;否則,析構函數將以不同的順序銷毀對  象,具體順序取決於構造對象的構造函數。為此帶來的底層操作開銷應該是不可接受的。

解決方案是,總是按成員聲明的順序編寫吃呢個月初始化語句。這樣,任何非法依賴都會顯而易見。當然,盡量不讓一個成員的初始化依賴於其他成員更好。

    許多編譯器在我們違反了此條規則時會發出警告。

最後更新:2017-04-03 12:55:19

  上一篇:go 如何將電腦中的文件徹底清除幹淨
  下一篇:go 讓IE的Button自適應文字寬度兼容