C ++:如何确保所有变量都已初始化?

时间:2013-04-09 06:16:17

标签: c++ initialization declaration

最近我对非初始化变量遇到了很多麻烦。

在Java中,变量的默认值为null,因此如果使用非初始化变量,则可能会抛出异常。如果我理解,在C ++中,变量是用内存中的任何数据初始化的。这意味着该程序可能会运行,甚至可能很难知道它有什么问题。

处理这个问题的干净方法是什么?是否有一些可以降低风险的良好编程习惯?在我的例子中,变量是在头文件中声明的,应该在cpp文件中初始化,这是一个使错误更有可能的事情的例子。

THX


版本收到几个答案后:

道歉,我的问题不够具体。

我可以使用标志让编译器获得非初始化变量的信息。

但是有一些罕见的套装变量在开始时无法初始化,因为这取决于系统的行为。

头文件中的

double learnedValue;

在cpp文件中

/* code that has nothing to do with learnedValue
...
*/

learnedValue = a*b*c; // values of a, b and c computed in the code above

/*code making use of learned value
...
*/

现在发生的事情是忘记了“learnedValue = a * b * c”这一行。

但是该程序运行良好,只是使用在声明它时内存中的内容初始化的learnedValue值。

在Java中,这样的错误不是问题,因为利用学习值的代码很可能会崩溃或抛出异常(至少你会知道出了什么问题)。

在C ++中,你显然很高兴,永远不会知道存在任何问题。还是?

5 个答案:

答案 0 :(得分:4)

请确保在编译程序时设置了适当的警告级别。 无论何时使用未初始化的变量,编译器都会发出适当的警告。

在g ++上,-Wall编译器选项会显示所有警告。

在Visual Studio上,您可能必须使用警告级别4。

此外,市场上还有一些静态代码分析工具。 cppCheck是免费提供的此类工具。

答案 1 :(得分:3)

您不应在标头中定义变量(仅声明它)。否则,当您在多个.cpp文件中包含标头时,您将收到其他错误。

实际定义变量时,您也可以给它一个初始值(如0)。在C ++中,通常会推迟(局部)变量的定义,直到您有一个值赋值给它们。

在头文件中

extern double learnedValue;
^^^^^^

在cpp文件中

double learnedValue = 0;

/* code that has nothing to do with learnedValue
...
*/

learnedValue = a*b*c; // values of a, b and c computed in the code above

/*code making use of learned value
...
*/

答案 2 :(得分:0)

您可以在声明的位置定义变量

答案 3 :(得分:0)

c ++ 11允许您初始化类中的变量。如果编译器尚未实现,那么构造函数初始化列表就是要检查的区域。

答案 4 :(得分:-1)

C#可以初始化变量。但是C ++没有,所以当使用没有初始化的指针时,它总是抛出异常。你应该养成一个好习惯来初始化类构造函数中的所有变量。