[C++]关键字explicit
[C++标准程序库 2.2.6]
通过关键字explicit的作用,我们可以禁止“单参数构造函数(single argument constructor)”被用于自动型别转换。
class Stack { explicit Stack(int size); // Create stack with initial size }; ... Stack s; s = 40; // Oops, creates a new Stack for 40 elements and assigns it to s
如果没有explicit,上面那个构造函数有能力将一个int自动转型为Stack。“自动型别转换”动作会把40转换为40个元素的Stack,并指派给s。
如果我们将构造函数声明为explicit,上述赋值操作就会导致编译错误。
注意: explicit同样也能拒绝“以复制语法进行带有转型操作的初始化”。
Stack s1(40); // OK
Stack s2 = 40; // ERROR
这是因为:
X x;
Y y(x); // explicit conversion
和
X x;
Y y = x; // implicit conversion
存在一个小差异。
前者透过显式转换,根据型别X产生一个型别Y的新对象。后者通过隐式转换,产生一个型别Y的新对象。