问题

有人发表在另一个关于C ++中 explicit 关键字含义的问题的评论中.那么,这是什么意思?



解决方法

在C ++中,编译器允许进行一个隐式转换来将参数解析为函数.这意味着编译器可以使用可通过单个参数调用的构造函数将一种类型转换为另一种类型,以获得参数的正确类型.

下面是一个具有可用于隐式转换的构造函数的示例类:

class Foo
{
public:
  // single parameter constructor, can be used as an implicit conversion
  Foo (int foo) : m_foo (foo) 
  {
  }

  int GetFoo () { return m_foo; }

private:
  int m_foo;
};

下面是一个简单的函数,它需要一个 Foo 对象:

void DoBar (Foo foo)
{
  int i = foo.GetFoo ();
}

这里是调用 DoBar 函数的地方.

int main ()
{
  DoBar (42);
}

参数不是 Foo 对象,而是 int .但是,存在一个 Foo 的构造函数,它接受一个 int ,因此这个构造函数可以用来将参数转换为正确的类型.

编译器允许为每个参数执行一次.

显式关键字前缀到构造函数中,防止编译器将该构造函数用于隐式转换.将它添加到上面的类将在函数调用 DoBar(42)时创建一个编译器错误.现在有必要用 DoBar(Foo(42))

您可能希望这样做的原因是为了避免意外构建,可以隐藏bug.设想示例:

  • You have a MyString(int size) class with a constructor that constructs a string of the given size. You have a function print(const MyString&), and you call it with print(3). You expect it to print "3", but it prints an empty string of length 3 instead.



相关问题推荐