C++ 为类(Class)提供了许多默认函数。如果自己没有申明,编译器会为我们提供一个copy构造函数、
一个copy assignment操作符和一个析构函数。此外,如果没有申明任何构造函数,
编译器会为我们申明一个default构造函数。很像下面的Empty类:
class Empty
{
public:
Empty();
Empty(const Empty &rhs);
~Empty();
Empty& operator=(const Empty &rhs);
};
就像Effective C++说的,如果不想使用编译器自动生成的函数,就应该明确拒绝。
1.C++中的隐式构造函数
如果c++类的其中一个构造函数有一个参数(或者多个默认参数),那么在编译的时候就会有一个缺省的转换操作:将该构造函数对应数据类型的数据转换为该类对象。
2.Explicit Constructors显式构造函数
为了避免上面提到的只有一个参数的构造函数采用的缺省转换操作,在构造函数前,使用Explicit 关键字修饰即可。
隐式构造使用情况1:(一个参数)
#include <stdio.h>
class Test
{
public:
Test(int a)
{
};
~Test()
{
};
};
int main()
{
// 将int转换为Test类型的对象,就是使用了隐式构造函数。
// 因为Test中存在一个只有一个参数的构造函数,且参数类型也是int。
// 如果在构造函数前加explicit ,表示为显示构造函数,
// 则编译不能通过。因为这时,就没有隐式构造函数啦。
Test test = 10;
return 0;
}
隐式构造使用情况2:(多个默认参数)
#include <stdio.h>
class Test
{
public:
Test(int a = 0, int b = 0, int c = 0)
{
};
~Test()
{
};
};
int main()
{
// 将int转换为Test类型的对象,就是使用了隐式构造函数。
// 因为Test中存在一个只有一个参数的构造函数,且参数类型也是int。
// 如果在构造函数前加explicit ,表示为显示构造函数,
// 则编译不能通过。因为这时,就没有隐式构造函数啦。
Test test = 10;
return 0;
}
只能显示调用情况
#include <stdio.h>
class Test
{
public:
explicit Test(int a)
{
};
~Test()
{
};
};
int main()
{
// 将int转换为Test类型的对象,就是使用了隐式构造函数。
// 因为Test中存在一个只有一个参数的构造函数,且参数类型也是int。
// 如果在构造函数前加explicit ,表示为显示构造函数,
// 则编译不能通过。因为这时,就没有隐式构造函数啦。
// Test test = 10; // 编译报错
Test test(10); // 正确
return 0;
}
本文转自:
http://www.cnblogs.com/xudong-bupt/p/3671972.html