变量未初始化为条件 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++的主要内容,如果未能解决你的问题,请参考以下文章
Dev c++编写C语言,数num初始化为0,但num的值恒定为2293312
C++中,类内的成员变量自动初始化为零吗,而全局变量随意赋值