class 中声明的枚举的默认值
Default value of enum declared in class
我有一个class,它的成员是一个在此class中声明的枚举:
#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;
}
我 know 如果在命名空间范围内声明枚举,它的默认值为 0,而在本地声明时,它没有任何默认值,这会导致未定义的行为。
我的问题是:如果我有一个属于 class 的枚举怎么办?这也是未定义的行为吗?
我测试了上面的代码,x.type 既不是 MAN 也不是 WOMAN.但是,我只针对一个编译器和一个操作系统完成了它。我对更一般的答案感兴趣。我在其他任何地方都没有找到有关此问题的任何信息。
Edit1:引用这个不确定的值会导致分段错误吗?
Edit2:我知道这不是一个精心设计的 class- 它不是我的,我正在尝试调试它。所以告诉我可以默认初始化对象并不能解决我的问题。请把它当作一个理论问题。
enum
中名字的默认值为 0,与 enum
的范围无关。
main
中的 test x;
等自动局部变量的默认值没有保证。它有一个 不确定的值 。使用该值是未定义的行为。
您可以像这样对它进行默认初始化:
test x{};
¹ 一个微妙的地方是,在顶层,这给出了一个“值初始化”。
如果您的对象没有任何构造函数,那么这取决于您在哪里创建对象。如果它是全局创建的,那么所有变量都是零初始化的。如果不是,则它们未正确初始化并且读取它们会导致 UB。
您可以使用 test x{};
语法强制对非全局变量进行零初始化。
首先:"Testing" 对于未定义的行为几乎永远不会给你正确的答案。
这是 undefined behavior 因为您正在从一个具有自动存储持续时间的未初始化变量中读取数据。这样的变量有一个不确定的值,不能从中读取。每个非静态函数范围变量都有自动存储持续时间。
我认为您混淆了枚举类型的 定义(发生在 class 定义中)与 声明 这种类型的变量(在函数范围内)。在您的示例中,x
是一个具有自动存储持续时间的变量,无论在何处定义类型 TYPE
。
我有一个class,它的成员是一个在此class中声明的枚举:
#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;
}
我 know 如果在命名空间范围内声明枚举,它的默认值为 0,而在本地声明时,它没有任何默认值,这会导致未定义的行为。
我的问题是:如果我有一个属于 class 的枚举怎么办?这也是未定义的行为吗?
我测试了上面的代码,x.type 既不是 MAN 也不是 WOMAN.但是,我只针对一个编译器和一个操作系统完成了它。我对更一般的答案感兴趣。我在其他任何地方都没有找到有关此问题的任何信息。
Edit1:引用这个不确定的值会导致分段错误吗?
Edit2:我知道这不是一个精心设计的 class- 它不是我的,我正在尝试调试它。所以告诉我可以默认初始化对象并不能解决我的问题。请把它当作一个理论问题。
enum
中名字的默认值为 0,与 enum
的范围无关。
main
中的 test x;
等自动局部变量的默认值没有保证。它有一个 不确定的值 。使用该值是未定义的行为。
您可以像这样对它进行默认初始化:
test x{};
¹ 一个微妙的地方是,在顶层,这给出了一个“值初始化”。
如果您的对象没有任何构造函数,那么这取决于您在哪里创建对象。如果它是全局创建的,那么所有变量都是零初始化的。如果不是,则它们未正确初始化并且读取它们会导致 UB。
您可以使用 test x{};
语法强制对非全局变量进行零初始化。
首先:"Testing" 对于未定义的行为几乎永远不会给你正确的答案。
这是 undefined behavior 因为您正在从一个具有自动存储持续时间的未初始化变量中读取数据。这样的变量有一个不确定的值,不能从中读取。每个非静态函数范围变量都有自动存储持续时间。
我认为您混淆了枚举类型的 定义(发生在 class 定义中)与 声明 这种类型的变量(在函数范围内)。在您的示例中,x
是一个具有自动存储持续时间的变量,无论在何处定义类型 TYPE
。