面试题答案
一键面试- 在C++类中定义枚举类型 在C++类中定义枚举类型很简单,如下例:
class MyClass {
public:
// 定义枚举类型
enum class MyEnum {
Value1,
Value2,
Value3
};
};
这里使用enum class
语法定义了强类型枚举,enum
也可以,不过enum class
更安全,避免命名冲突。
- 枚举类型的作用域规则
- 对于
enum class
定义的枚举类型,其作用域被限定在类中。例如在上面的MyClass
类中,MyEnum
只能在MyClass
类及其成员函数内直接使用。如果在类外使用,需要使用类名限定,如MyClass::MyEnum
。 - 对于传统的
enum
定义(没有class
关键字),其枚举常量会被提升到包含该enum
的作用域中。例如:
- 对于
class OldStyleEnumClass {
public:
enum OldEnum {
OldValue1,
OldValue2
};
};
// 在类外可以直接使用OldValue1,OldValue2,但不推荐,因为会污染命名空间
OldStyleEnumClass::OldEnum value = OldValue1;
- 在类的不同成员函数中正确使用该枚举类型 在类的成员函数中,可以直接使用类内定义的枚举类型,无需额外的限定,除非有命名冲突。例如:
class MyClass {
public:
enum class MyEnum {
Value1,
Value2,
Value3
};
void myFunction() {
MyEnum myValue = MyEnum::Value1; // 直接使用枚举类型
switch (myValue) {
case MyEnum::Value1:
// 处理逻辑
break;
case MyEnum::Value2:
// 处理逻辑
break;
case MyEnum::Value3:
// 处理逻辑
break;
}
}
};
- 在类的继承体系中,枚举类型的可见性和使用方式的变化
- 对于
enum class
:- 可见性:在继承体系中,
enum class
定义的枚举类型的可见性遵循类成员的访问控制规则。如果MyClass
是基类,DerivedClass
继承自MyClass
,当继承方式为public
时,DerivedClass
可以访问MyClass
中的MyEnum
,使用方式同样是MyClass::MyEnum
或者在DerivedClass
的成员函数中直接使用(因为作用域限定在类内)。如果继承方式为private
或protected
,则DerivedClass
对MyClass
的MyEnum
的访问会受到相应限制。 - 使用方式:在
DerivedClass
的成员函数中使用MyEnum
时,与在MyClass
成员函数中的使用方式相同。例如:
- 可见性:在继承体系中,
- 对于
class MyClass {
public:
enum class MyEnum {
Value1,
Value2,
Value3
};
};
class DerivedClass : public MyClass {
public:
void derivedFunction() {
MyEnum myValue = MyEnum::Value2; // 可以直接使用
}
};
- 对于传统
enum
:- 可见性:传统
enum
的可见性也遵循继承体系中的访问控制规则。但是由于其枚举常量会提升到包含该enum
的作用域中,在DerivedClass
中,如果访问权限允许,可能会与DerivedClass
中其他同名标识符产生命名冲突。 - 使用方式:在
DerivedClass
中使用OldEnum
时,同样要遵循访问控制规则。如果继承方式为public
,在DerivedClass
成员函数中可以直接使用枚举常量,例如:
- 可见性:传统
class OldStyleEnumClass {
public:
enum OldEnum {
OldValue1,
OldValue2
};
};
class DerivedOldStyleClass : public OldStyleEnumClass {
public:
void derivedOldFunction() {
OldEnum value = OldValue1; // 可以直接使用
}
};