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