explicit。
关键字在 C++ 用于修饰结构函数防止隐式类型转换或隐式构造函数调用。刚开始的 C++ 学习者,了解这个关键词的功能和使用场景是非常重要的,因为它可以帮助避免代码中的一些潜在错误。
在 C++ 中,如果一个类的构造函数可以用一个参数来初始化,所以在某些情况下,该构造函数将自动用于隐式转换。例如:
class。MyClass。{。std。::。cout。 <<"Constructor called with value: "<
这里,MyClass。
类有一个结构函数。 MyClass(int value)。
,它有一个整数参数。 value。
。构造函数被声明为。 explicit。
,这意味着它不能被隐式调用。
对象创建。:。
MyClass。 obj。(。42。)。;
MyClass。
是类名,表示要创建的对象类型。obj。
变量名(即对象名称)。(42)。
它是传递给构造函数的参数。这个代码做了以下事情:
MyClass。
类型对象。42。
给结构函数该参数定义为构造函数。 int value。
对应。42。
作为。 value。
值传入结构函数。std::cout。
语句会输出 “Constructor called with value: 42”。explicit。
的作用。因为使用了构造函数。 explicit。
修改c;这意味着你必须显式地传递一个参数来调用它。这防止了隐式转换(即自动从。 int。
类型转换为。 MyClass。
类型)。所以,必须清楚地写出创建对象的句子:
MyClass。 obj。(。42。)。;// 正确。
假如你试图向需要传递一个整数。 MyClass。
类型对象的函数,没有显式创建对象,编译错误,因为不允许隐式转换a;
void。someFunction。(。MyClass obj。)。;someFunction。(。42。)。;// 错误,不允许隐式转换。
这一行代码。 MyClass obj(42);
是用。 42。
作为参数来显式调用。 MyClass。
构造函数,一个名字是创建和初始化的。 obj。
的对象。explicit。
关键字确保这个对象的创建必须是显式的,避免不必要的隐式转换。
分享让更多人看到