未初始化的C++ enum class变量值异常及比较结果不符问题咨询
未初始化枚举类变量的行为解析
问题1:为啥m_e没被初始化成C::E::a或者C::E::b?
在C++里,只要你自定义了结构体的构造函数,那构造函数没显式初始化的非静态成员,就会处于未初始化状态——内存里留的是之前的垃圾值,不会自动设成枚举的默认值。
你代码里的C()构造函数只给m_a赋了值,完全没管m_e,所以m_e的内存值就是随机的垃圾数据,自然不会是C::E::a(对应0)或者C::E::b(对应1)。
要解决这个问题,要么在构造函数里显式初始化m_e:
C() : m_a(1), m_e(E::a) {}
要么直接在成员声明的时候给初始值:
E m_e = E::a;
问题2:为啥c.m_e == C::E::a的结果是253/255,不是0或者1?
这是未定义行为导致的——因为m_e没初始化,读取它的值本身就违反了C++的规则,标准对这种行为的结果没有任何保证,程序输出啥都有可能,甚至直接崩溃。
你看到的253、255根本不是合法的布尔值(C++里bool只有0和1两个有效取值),就是未定义行为下的随机输出而已。
另外提一句:就算m_e初始化好了,用printf("%d")输出bool值也不是最规范的写法,要么把布尔值转成int再传,要么直接用cout输出,它会自动处理格式。
内容的提问来源于stack exchange,提问作者sfzhang
相关产品推荐
相关产品推荐

