c++ - 显式关键字是什么意思?

标签 c++ constructor explicit c++-faq explicit-constructor

explicit关键字在C++中是什么意思?

最佳答案

允许编译器进行一次隐式转换以将参数解析为函数。这意味着编译器可以使用可通过单个参数调用的构造函数从一种类型转换为另一种类型,以便为参数获取正确的类型。

这是一个带有构造函数的示例类,可用于隐式转换:

class Foo
{
private:
  int m_foo;

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

  int GetFoo () { return m_foo; }
};

这是一个接受 Foo 对象的简单函数:

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

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

int main ()
{
  DoBar (42);
}

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

允许编译器对每个参数执行一次。

在构造函数前添加 explicit 关键字可防止编译器使用该构造函数进行隐式转换。将其添加到上述类中会在函数调用 DoBar (42) 处产生编译器错误。现在需要使用 DoBar (Foo (42))

显式调用转换

您可能希望这样做的原因是避免可能隐藏错误的意外构造。
人为的例子:

  • 你有一个 MyString 类,它有一个构造函数,可以构造一个给定大小的字符串。你有一个函数 print(const MyString&) (以及一个重载 print (char *string)),你调用 print(3)(当您实际上打算调用print("3")时)。您希望它打印“3”,但它会打印一个长度为 3 的空字符串。

关于c++ - 显式关键字是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/121162/

相关文章:

c++ - 如何使用remove_if从 vector 中删除元素

Java - 为构造函数的每个实例定义不同的变量?

java - 当默认构造函数被弃用时如何调用父类的构造函数

PHP 类和构造函数内的静态属性

C#:显式命名空间未出现在生成的 XML 中

c++ - 最佳实践编码 C++

c++ - 哪些 Windows 编译器支持 <future> 类

c++ - 异常段错误

c++ - 过载分辨率 : What is the role of explicit and the initialization syntax?

c++ - 为什么 boost::shared_array 的显式构造函数会导致错误?