C++ C++;:如何确保所有变量都已初始化?
最近我遇到了很多关于未初始化变量的问题 在Java中,变量的默认值为null,因此如果使用未初始化的变量,则可能会引发异常。如果我理解,在C++中,变量被初始化,任何数据都被显示在内存中。这意味着程序可能会运行,甚至很难知道它有什么问题 处理这个问题的干净方法是什么?是否有一些好的编程习惯可以降低风险?在我的例子中,变量是在头文件中声明的,应该在cpp文件中初始化,这是一个使错误更容易发生的示例 thxC++ C++;:如何确保所有变量都已初始化?,c++,initialization,declaration,C++,Initialization,Declaration,最近我遇到了很多关于未初始化变量的问题 在Java中,变量的默认值为null,因此如果使用未初始化的变量,则可能会引发异常。如果我理解,在C++中,变量被初始化,任何数据都被显示在内存中。这意味着程序可能会运行,甚至很难知道它有什么问题 处理这个问题的干净方法是什么?是否有一些好的编程习惯可以降低风险?在我的例子中,变量是在头文件中声明的,应该在cpp文件中初始化,这是一个使错误更容易发生的示例 thx 收到少量答案后的版本: 对不起,我的问题不够具体 我得到的答案是使用标志,让编译器了解未初
收到少量答案后的版本: 对不起,我的问题不够具体 我得到的答案是使用标志,让编译器了解未初始化的变量,这将非常有用 但是很少有cased变量不能在开始时初始化,因为这取决于系统的行为 在头文件中
double learnedValue;
extern 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++中,你显然可以快乐,永远不会知道有问题。或者?您可以在声明变量的现场定义变量您可以在声明变量的现场定义变量请确保在编译程序时设置了适当的警告级别。 每当使用未初始化的变量时,编译器都会发出相应的警告 在g++上,-Wall编译器选项将显示所有警告 在Visual studio上,可能必须使用警告级别4 此外,市场上还有一些静态代码分析工具。
是免费提供的此类工具。请确保在编译程序时设置了适当的警告级别。 每当使用未初始化的变量时,编译器都会发出相应的警告 在g++上,-Wall编译器选项将显示所有警告 在Visual studio上,可能必须使用警告级别4 此外,市场上还有一些静态代码分析工具。
c++11允许您在类内初始化变量。如果编译器还没有实现,那么构造函数初始化列表就是要检查的区域。c++11允许您初始化类内的变量。如果编译器还没有实现,那么构造函数初始化列表就是要检查的区域。您不应该在头中定义变量(只声明它)。否则,当您在多个.cpp文件中包含标题时,将出现其他错误 在实际定义变量时,还可以给它一个初始值(如0)。在C++中,也可以推迟(局部)变量的定义,直到有一个赋值给它们的值。 在头文件中
double learnedValue;
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
...
*/
您不应该在头中定义变量(只声明它)。否则,当您在多个.cpp文件中包含标题时,将出现其他错误 在实际定义变量时,还可以给它一个初始值(如0)。在C++中,也可以推迟(局部)变量的定义,直到有一个赋值给它们的值。 在头文件中
double learnedValue;
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
...
*/
C#可以初始化变量。但是C++没有,所以当使用指针而不初始化时,它总是抛出异常。您应该养成初始化类构造函数中所有变量的好习惯。C#可以初始化变量。但是C++没有,所以当使用指针而不初始化时,它总是抛出异常。您应该养成初始化类构造函数中所有变量的好习惯。习惯于在变量定义变量初始化。在C++中,变量用初始化的任何初始化初始化。如果你让它们不确定,你就掷骰子并抓住机会(即不确定=用作评估时未定义的行为)。只需将变量定义为你想要的任何值。例如,如果声明一个
int
,则将其设置为0
。可以使用编译器警告标志。对于eample,如果您使用的是gcc<代码> -WunRealPrime将警告您所有未初始化的变量。总是使用<代码>墙> <代码>和<代码> Wextra < /COD>,在声明时总是初始化,并且处理与代码有关联的代码时的痛苦:在定义中养成初始化变量的习惯。C++中变量是用您决定用的任何东西初始化的。如果你让它们不确定,你就掷骰子并抓住机会(即不确定=用作评估时未定义的行为)。只需将变量定义为你想要的任何值。例如,如果声明一个int
,则将其设置为0
。可以使用编译器警告标志。对于eample,如果您使用的是gcc-Wuninitialized
将警告您所有未初始化的变量。始终使用-Wall
和-Wextra
构建,始终在声明时初始化,并处理与有bug的代码链接时的痛苦:)而不是使用静态或常量成员变量。其他成员变量应该在构造函数中初始化。@scones那么您如何定义常量变量?常量成员变量(我所说的)是在构造函数中定义的。静态常量成员变量在.cpp文件中定义(可能除外)