原文:
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