变量未初始化为条件 C++

Posted

技术标签:

【中文标题】变量未初始化为条件 C++【英文标题】:Variable not initialized as condition c++ 【发布时间】:2013-06-07 18:44:36 【问题描述】:

我想做一个如果喜欢:

if(x has not been initialized)
...

这可能吗?谢谢

【问题讨论】:

不,不是。这就是为什么最好在声明时初始化所有变量的原因。 (在作品“初始化”的标准含义中)。您当然可以设计您的课程并将“初始化”定义为“在您调用 Init() 之后,但这是不同的。 如果你需要这种东西,也许看看boost::optional或C++14 std::optional x的存储时长是多少?如果是静态的,那是完全有可能的。 只是好奇我们要检查 x 是否已初始化。如果您有问题陈述,请更新主题。 Checking if a variable is initialized的可能重复 【参考方案1】:

“没有办法检查变量的内容是否未定义。您可以做的最好的事情是分配一个信号/哨兵值(例如在构造函数中)以指示进一步初始化将需要执行。”

Alexander Gessler

来自here

【讨论】:

【参考方案2】:

要实现该行为,您可以使用指针,默认初始化为 0。

例如:

int *number = 0;
// ...
if (!number) 
    // do something

您可以对任何类型使用该技巧,而不仅仅是整数:

Cat *kitty = 0;
// ...
if (!kitty) 
    // do something

【讨论】:

【参考方案3】:

a) 对于 int 等原始数据类型,float 无法知道其是否已初始化。

b) 对于指针,您可以检查它是否不是 nullptr

if(ptr != nullptr)


c) 对于自定义类,你需要引入 bool 成员,该成员可以在构造函数中设置为 true,以便我们可以使用它来检查对象是否已初始化。

if(obj.isInitialized())


【讨论】:

【参考方案4】: 如果有指针,可以用nullptr表示“未初始化”。 如果你有一个非指针,你可以使用boost::optional<T>(或std::optional<T>,当它可用时)。 否则,天真的“bool initialized;”标志将不得不这样做。 optional<T> 基本上只是封装了这个标志。

【讨论】:

【参考方案5】:

对于 C++-11,您可以考虑使用智能指针存储变量。将 yor 变量 x(假设 x 为 int)声明为

std::shared_ptr<int> x;

分配变量x时,使用

x = std::make_shared<int>(newValueOfX);

然后您可以通过检查确定是否曾经分配过x

if (this->x)  ... 

有关更详细的示例,请参阅Checking if a variable is initialized。

【讨论】:

【参考方案6】:

嗯,类似的东西适用于指针。说:

int* x = NULL;  //initialize
if(x == NULL)

    //dostuff

或者干脆

if(!x)

    //dostuff

不确定是否有办法只使用常规 int

编辑:现在我想起来了,Luthian 是对的。那将是未定义的行为。正如其他人所说,您必须初始化为某个已知值。

【讨论】:

没有。那是未定义的行为。在调试版本之外(可以说),x 很可能不会被初始化为 NULL 是的,你是对的@LuchianGrigore 现在我想了。

以上是关于变量未初始化为条件 C++的主要内容,如果未能解决你的问题,请参考以下文章

C++ 基本知识整理

Dev c++编写C语言,数num初始化为0,但num的值恒定为2293312

变量初始化(C# 和 C++)

C++中,类内的成员变量自动初始化为零吗,而全局变量随意赋值

在 C 中,为啥我的初始化为 0 的 int 变量会被“nm”报告为未初始化?

指针变量初始化为NULL啥意思?