1.explicit禁止的是隐式使用构造函数。
class Foo{
public:
explicit Foo(int i = 0) : data(i) {}
private:
int data;
};
比如对于类Foo,如果使用Foo f = 1
语句,实际上会发生隐式转换:用1初始化一个临时的Foo对象。即整个过程为:Foo temp_f(1); Foo f = temp_f;
而explicit会禁止隐式的调用构造函数即Foo temp_f(1)过程。
2.拷贝构造函数不能使用explicit修饰,因为很多地方都要使用隐式的拷贝构造函数。比如:
- 将一个对象作为实参传递给一个非引用类型的形参
- 从一个返回类型为非引用类型的函数返回一个对象
- 用花括号列表初始化一个数组中的元素或一个聚合类中的成员