C++ 為類(Class)提供了許多默認函數。如果自己沒有申明,編譯器會為我們提供一個copy構造函數、一個copy assignment操作符和一個析構函數。此外,如果沒有申明任何構造函數,編譯器會為我們申明一個default構造函數。很像下面的Empty類: 復制代碼 1 class Empty{ 2 public: 3 Empty(); 4 Empty(const Empty &rhs); 5 ~Empty(); 6 Empty& operator=(const Empty &rhs); 7 }; 復制代碼 就像Effective C++說的,如果不想使用編譯器自動生成的函數,就應該明確拒絕。 1.C++中的隱式構造函數 如果c++類的其中一個構造函數有一個參數,那麼在編譯的時候就會有一個缺省的轉換操作:將該構造函數對應數據類型的數據轉換為該類對象。 2.Explicit Constructors顯式構造函數 為了避免上面提到的只有一個參數的構造函數采用的缺省轉換操作,在構造函數前,使用Explicit 關鍵字修飾即可。 3.如下面的例子: 復制代碼 1 #include <iostream> 2 using namespace std; 3 class B{ 4 public: 5 int data; 6 B(int _data):data(_data){} 7 //explicit B(int _data):data(_data){} 8 }; 9 10 int main(){ 11 B temp=5; 12 cout<<temp.data<<endl; 13 return 0; 14 } 復制代碼 程序第11行,將int轉換為B類型的對象,就是使用了隱式構造函數。因為B中存在一個只有一個參數的構造函數,且參數類型也是int。 如果在構造函數前加explicit ,表示為顯示構造函數,則第11行編譯不能通過。因為這時,就沒有隱式構造函數啦。