C++ Explicit Constructors(顯式構造函數)

  C++ 爲類(Class)提供了許多默認函數。若是本身沒有申明,編譯器會爲咱們提供一個copy構造函數、一個copy assignment操做符一個析構函數。此外,若是沒有申明任何構造函數,編譯器會爲咱們申明一個default構造函數。很像下面的Empty類:ios

1 class Empty{
2     public:
3         Empty();
4         Empty(const Empty &rhs);
5         ~Empty();
6         Empty& operator=(const Empty &rhs);
7 };

   就像Effective C++說的,若是不想使用編譯器自動生成的函數,就應該明確拒絕。c++

1.C++中的隱式構造函數函數

  若是c++類的其中一個構造函數有一個參數,那麼在編譯的時候就會有一個缺省的轉換操做:將該構造函數對應數據類型的數據轉換爲該類對象。spa

2.Explicit Constructors顯式構造函數.net

  爲了不上面提到的只有一個參數的構造函數採用的缺省轉換操做,在構造函數前,使用Explicit 關鍵字修飾便可。code

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。blog

  若是在構造函數前加explicit ,表示爲顯示構造函數,則第11行編譯不能經過。由於這時,就沒有隱式構造函數啦。ci

 

參考:http://blog.csdn.net/smilelance/article/details/1528737get

相關文章
相關標籤/搜索