[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的新对象。

 

posted on 2013-05-20 19:08  Lo0ong  阅读(182)  评论(0编辑  收藏  举报

导航