為什麼要避免單參數構造函數? 下面的代碼定義了兩個類A和B,B支持<<,A不支持(這是一個疏忽),正常情況下這應該發生編譯錯誤,但是由於B存在從A構造的功能(注意,這是A不能控制的),代碼編譯通過,但是執行結果是完全無法理解的。如果此問題發生在一個大型項目中(也就是涉及到的類和函數分布在不同目錄的不同文件中),不能假設這個問題可以被輕易解決。 class A { public: string type()const{return "A";} }; class B { public: B(){cout<<"B()"<<endl;} B(A a){cout<<"B(A a)"<<endl;}//此代碼導致A可以被自動構造出B string type()const{return "B";} }; ostream& operator<<(ostream& os, const B& tmp) { return os<<tmp.type()<<" "<<&tmp; } void defaulttest() { A a; B b; cout<<b.type()<<" "<<&b<<endl; cout<<b<<endl; cout<<endl; cout<<a.type()<<" "<<&a<<endl; cout<<a<<endl; } 輸出: B() B 0xfffffffffffefb1 B 0xfffffffffffefb1 ----------------- cou<<b A 0xfffffffffffefb0 B(A a) B 0xfffffffffffeff8 -------------------cout<<a 很明顯這個B是新構造的 刪除B(A a)後編譯出錯,這才是正確的結果: "operator<<(ostream &, const B &)" is not a viable candidate. (示例代碼運行環境:IBM AIX , xlC)