C++ 使用枚举变量调用构造函数
C++ calling a constructor with enum variable
有class定义如下
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
对象,并将使用提供的构造函数自动执行此操作,因为构造函数未标记为 explicit
。 (单参数非 explicit
构造函数可隐式用于可隐式转换为构造函数参数类型的类型与声明构造函数的类型之间的转换。)
如果你把你的构造函数改成explicit IOOptions(int opt = 0) : _options(opt) { }
那么你会发现第一种语句形式不再编译,但是第二种形式会继续编译成功。
有class定义如下
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
对象,并将使用提供的构造函数自动执行此操作,因为构造函数未标记为 explicit
。 (单参数非 explicit
构造函数可隐式用于可隐式转换为构造函数参数类型的类型与声明构造函数的类型之间的转换。)
如果你把你的构造函数改成explicit IOOptions(int opt = 0) : _options(opt) { }
那么你会发现第一种语句形式不再编译,但是第二种形式会继续编译成功。