C++ 為類(Class)提供了許多默認函數(shù)钠导。如果自己沒有申明,編譯器會為我們提供一個copy構造函數(shù)珍策、一個copy assignment操作符和一個析構函數(shù)毅人。此外吭狡,如果沒有申明任何構造函數(shù),編譯器會為我們申明一個default構造函數(shù)丈莺。很像下面的Empty類:
class Empty{
public:
Empty();
Empty(const Empty &rhs);
~Empty();
Empty& operator=(const Empty &rhs);
};
就像Effective C++說的划煮,如果不想使用編譯器自動生成的函數(shù),就應該明確拒絕场刑。
1.C++中的隱式構造函數(shù)
如果c++類的其中一個構造函數(shù)有一個參數(shù)般此,那么在編譯的時候就會有一個缺省的轉換操作:將該構造函數(shù)對應數(shù)據類型的數(shù)據轉換為該類對象。
2.Explicit Constructors顯式構造函數(shù)
為了避免上面提到的只有一個參數(shù)的構造函數(shù)采用的缺省轉換操作牵现,在構造函數(shù)前铐懊,使用explicit 關鍵字修飾即可。
3.如下面的例子:
#include <iostream>
using namespace std;
class B{
public:
int data;
B(int _data):data(_data){}
//explicit B(int _data):data(_data){}
};
int main(){
B temp=5;
cout<<temp.data<<endl;
return 0;
}
程序第11行瞎疼,將int轉換為B類型的對象科乎,就是使用了隱式構造函數(shù)。因為B中存在一個只有一個參數(shù)的構造函數(shù)贼急,且參數(shù)類型也是int茅茂。
如果在構造函數(shù)前加explicit 捏萍,表示為顯示構造函數(shù),則第11行編譯不能通過空闲。因為這時令杈,就沒有隱式構造函數(shù)啦。