C++ C++;使用枚举变量调用构造函数

C++ C++;使用枚举变量调用构造函数,c++,C++,有一个类定义如下 class IOOptions { public: IOOptions(int opt = 0) : _options(opt) { } \\ blah blah typedef enum { OPT1= 1, OPT2= 2} IOOopts; protected: int _options; }; 下面这两种说法是等价的吗 语句1:IOOptions io=IOOptions::OPT1 语句2:IOOptions io

有一个类定义如下

class IOOptions
{
    public:
    IOOptions(int opt = 0) : _options(opt) { }
    \\ blah blah
    typedef enum { OPT1= 1, OPT2= 2} IOOopts;

    protected:
    int _options;
};
下面这两种说法是等价的吗

  • 语句1:
    IOOptions io=IOOptions::OPT1
  • 语句2:
    IOOptions io=IOOptions(IOOptions::OPT1)

是的,两种说法具有相同的效果。但还有第三种选择,许多人可能会发现这一点更加明确:

IOOptions io(IOOptions::OPT1);

是的,这两种说法具有相同的效果。但还有第三种选择,许多人可能会发现这一点更加明确:

IOOptions io(IOOptions::OPT1);

是的,这两种说法具有相同的效果。但还有第三种选择,许多人可能会发现这一点更加明确:

IOOptions io(IOOptions::OPT1);

是的,这两种说法具有相同的效果。但还有第三种选择,许多人可能会发现这一点更加明确:

IOOptions io(IOOptions::OPT1);

是的,他们是。第一条语句隐式调用构造函数。编译器将尝试将枚举值转换为
IOOptions
对象,并将使用提供的构造函数自动转换,因为构造函数未标记为
explicit
。(一个单参数非显式
构造函数可以在隐式转换为构造函数的参数类型的类型与声明构造函数的类型之间的转换中隐式使用。)


如果将构造函数更改为显式IOOptions(int opt=0):\u options(opt){}
,则会发现第一个语句表单不再编译,但第二个表单将继续成功编译。

是的,它们是。第一条语句隐式调用构造函数。编译器将尝试将枚举值转换为
IOOptions
对象,并将使用提供的构造函数自动转换,因为构造函数未标记为
explicit
。(一个单参数非显式构造函数可以在隐式转换为构造函数的参数类型的类型与声明构造函数的类型之间的转换中隐式使用。)


如果将构造函数更改为显式IOOptions(int opt=0):\u options(opt){},则会发现第一个语句表单不再编译,但第二个表单将继续成功编译。

是的,它们是。第一条语句隐式调用构造函数。编译器将尝试将枚举值转换为
IOOptions
对象,并将使用提供的构造函数自动转换,因为构造函数未标记为
explicit
。(一个单参数非显式构造函数可以在隐式转换为构造函数的参数类型的类型与声明构造函数的类型之间的转换中隐式使用。)


如果将构造函数更改为显式IOOptions(int opt=0):\u options(opt){},则会发现第一个语句表单不再编译,但第二个表单将继续成功编译。

是的,它们是。第一条语句隐式调用构造函数。编译器将尝试将枚举值转换为
IOOptions
对象,并将使用提供的构造函数自动转换,因为构造函数未标记为
explicit
。(一个单参数非显式构造函数可以在隐式转换为构造函数的参数类型的类型与声明构造函数的类型之间的转换中隐式使用。)

如果将构造函数更改为
explicit IOOptions(int opt=0):\u options(opt){}
,则会发现第一个语句表单不再编译,但第二个表单将继续成功编译