close

原文:
http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Explicit_Constructors

當一個class的ctor只有一個parameter時,例如:

class CFoo
{
public:
    CFoo(int n)
    {
    }
};

此時隱式轉換(implicit conversion)可能在下列情況產生:

void Bar(CFoo f)
{

}

void main()
{
    int n = 15;
    CFoo foo(10);
    foo = n;

    Bar(13);
}

以上這段程式可以通過編譯,不會出現Error。透過隱式轉換可以把整數n賦值給foo,也可以把13傳給函式Bar(),這樣的隱式轉換雖然很方便,但是卻是錯誤的根源;programmer可能只是一時不察,無意作這樣的轉換,但是這樣的隱式轉換卻不會出現任何Error,有可能會因此造成bug。

所以Google C++ Style Guide規定,所有只有一個parameter的ctor前面必須再加上關鍵字explicit,以避免這樣的引式轉換產生,上述的程式在CFoo(int)前面加上explicit後,將無法通過編譯。

當然還是有少數的情況下可以不加explicit(但是你必須加上詳細的註解來解釋):
1. copy ctor可以不加explicit(只有少數的class會有需要copy ctor的需求)
2. 當你的class是作為wrapper用來包裝其他class時也可以不加explicit

arrow
arrow
    文章標籤
    C++
    全站熱搜
    創作者介紹
    創作者 coherence 的頭像
    coherence

    打字猴

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