Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 类中声明的枚举的默认值_C++_Enums_Undefined_Undefined Behavior - Fatal编程技术网

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全权负责执行各种意外的优化。但这也是因为体系结构可以对整数值使用陷阱表示,和/或使用额外的陷阱位捕获未初始化(不确定)值的使用。