C++ 类中声明的枚举的默认值
我有一个类,其成员是该类中声明的枚举:C++ 类中声明的枚举的默认值,c++,enums,undefined,undefined-behavior,C++,Enums,Undefined,Undefined Behavior,我有一个类,其成员是该类中声明的枚举: #include<iostream> class test { public: enum TYPE{MAN, WOMAN}; TYPE type; }; int main() { test x; if(x.type == test::MAN) std::cout<<"MAN"<<std::endl; if(x.type == test::WOMAN) std::cout&l
#include<iostream>
class test
{
public:
enum TYPE{MAN, WOMAN};
TYPE type;
};
int main()
{
test x;
if(x.type == test::MAN) std::cout<<"MAN"<<std::endl;
if(x.type == test::WOMAN) std::cout<<"WOMAN"<<std::endl;
std::cout<<"ok"<<std::endl;
return 0;
}
#包括
课堂测试
{
公众:
枚举类型{男,女};
类型;
};
int main()
{
测试x;
如果(x.type==test::MAN)std::cout则enum
中名字的默认值为0,而与enum
的范围无关
这里没有像main
中的testx;
这样的自动局部变量的保证默认值。它有一个不确定的值。使用该值是未定义的行为
您可以按如下方式初始化它:
test x{};
一个微妙的点是,在顶层,这给出了一个“值初始化”。
无论枚举的范围如何,枚举中名的默认值为0
这里没有像main
中的testx;
这样的自动局部变量的保证默认值。它有一个不确定的值。使用该值是未定义的行为
您可以按如下方式初始化它:
test x{};
一个微妙的点是,在顶层,这给出了一个“值初始化”。
如果对象没有任何构造函数,则取决于您在何处创建对象。如果对象是全局创建的,则所有变量均为零初始化。如果不是,则未正确初始化,从中读取将导致UB
您可以使用test x{};
语法强制非全局变量的零初始化。如果您的对象没有任何构造函数,则这取决于您创建对象的位置。如果是全局创建的,则所有变量都是零初始化的。如果不是,则未正确初始化,从中读取将导致UB
您可以使用testx{};
语法强制对非全局变量进行零初始化。首先,“测试”未定义的行为几乎永远不会给您正确的答案
这是因为您正在读取具有自动存储持续时间的未初始化变量。此类变量的值不确定,因此不能从中读取。每个非静态函数作用域变量都具有自动存储持续时间
我认为您混淆了枚举类型的定义(发生在类定义内部)和该类型变量的声明(在函数范围内)在您的示例中,x
是一个具有自动存储持续时间的变量,无论类型type
定义在何处。首先,“测试”未定义的行为几乎永远不会给您正确的答案
这是因为您正在读取具有自动存储持续时间的未初始化变量。此类变量的值不确定,因此不能从中读取。每个非静态函数作用域变量都具有自动存储持续时间
我认为您混淆了枚举类型的定义(发生在类定义内部)和该类型变量的声明(在函数范围内)在您的示例中,x
是一个具有自动存储持续时间的变量,无论类型type
定义在何处。这与枚举无关。struct x{int n;};
也会有完全相同的问题。你应该给你的类型
成员一个大括号或相等的初始化器,或者给你的测试
类一个默认构造函数一个默认值,初始化类型
它不是关于枚举,而是关于读取一个未初始化的变量。UB。这与en没有任何关系ums.struct X{int n;};
也会有完全相同的问题。你应该给你的类型
成员一个大括号或相等的初始化器,或者给你的测试
类一个默认构造函数一个默认值,并初始化类型
它不是关于枚举,而是关于读取一个未初始化的变量。UB.OP询问枚举的默认值变量。我认为OP是指类型的默认值object@Cheers嗯。-引用这个不确定的值会导致分段错误吗?@user2738748:理论上是的,对于UB,任何事情都可能发生。这不仅仅是因为编译器可以将正式UB视为全权委托来执行所有类型的un操作预期的、令人惊讶的优化。但这也是因为架构可以具有整数值的陷阱表示,和/或使用额外的陷阱位捕获未初始化(不确定)的使用values.OP询问未初始化的枚举变量的默认值。我认为OP指的是类型的默认值object@Cheershth。-引用这个不确定的值会导致分段错误吗?@user2738748:理论上是的,使用UB任何事情都可能发生。这不仅仅是因为编译器可以看到形式l UB全权负责执行各种意外的优化。但这也是因为体系结构可以对整数值使用陷阱表示,和/或使用额外的陷阱位捕获未初始化(不确定)值的使用。