程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++編碼技術:為什麼要避免單參數構造函數?

C++編碼技術:為什麼要避免單參數構造函數?

編輯:C++入門知識

為什麼要避免單參數構造函數? 下面的代碼定義了兩個類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)  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved