以下短语在C++中的含义是什么:
零初始化,
默认初始化,和
值初始化
C++开发人员应该了解他们什么?
我的问题与此以及其他几个相似的问题有些重叠.那些有一些很好的答案,但我已经读过了,我仍然感到困惑,所以请不要认为这个问题是重复的.
所以,我有以下代码:
class A {
public: int _a;
}
void main()
{
A inst1;
A* inst2 = new A;
A* inst3 = new A();
}
Run Code Online (Sandbox Code Playgroud)
_a未初始化in inst1和in inst2初始化为0in inst3.调用哪个初始化,以及代码为何如此工作?请考虑我的帐户我手头没有C++ 03标准,但我有最后的C++ 11草案(我按'03标准编程),所以'03标准的引用或对'11的引用非常欢迎.
PS这项研究背后的原始任务是正确地初始化任意模板类型的成员T.
我知道默认情况下会初始化一些POD变量,但其他变量不是.(POD类型包括int,float指针,联合,POD类型的数组,POD类型的结构等)
范围和存储类如何影响POD类型的默认初始化?
具体而言,将隐式初始化以下哪项:
new我知道存在一些与这些情况有关的问题,但没有全面的问题(它们只涉及具体情况).
枚举类的默认初始化/构造是否定义了行为?
这是一个最小的示例(在线试用)
enum class ALPHA{
X = 0,
Y = 1,
Z = 2,
};
int main()
{
ALPHA a = ALPHA(); // use default constructor
ALPHA b{}; // use default initialization
std::cout <<static_cast<int>(a) << std::endl; // 0
std::cout <<static_cast<int>(b) << std::endl; // 0
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在两种情况下我都为零。那么默认初始化是否总是选择第一个枚举类型(例如,此处X = 0)?我知道对于标准枚举它是UB,但是我不确定枚举类的语义吗?我也在CPPReference上查询了此信息,但没有找到有关它的任何相关信息-是否也可以获得标准参考?
我只是让Apple的C/C++编译器将浮点数初始化为非零值(大约"-0.1").
这是一个很大的惊喜 - 只是偶尔发生(但是100%可重复,如果你事先通过相同的函数调用/ args).追踪(使用断言)需要很长时间.
我以为浮标是零初始化的.谷歌搜索表明我正在考虑C++(当然这对于这些东西更为精确 - 参见SO:在C++中默认初始化的原始类型是什么?).
但也许Apple的借口是他们的编译器在C模式下运行......所以:C怎么样?应该发生什么,(更重要的是)什么是典型的?
(当然我应该手动初始化它 - 我通常会这样做 - 但是在这种情况下我失败了.但我没想到它会爆炸!)
(对于任何关于此问题的讨论,谷歌都证明是无用的 - 他们目前的搜索拒绝显示没有"C++"的"C".继续决定我太愚蠢,即使在高级模式下运行也忽略了我的输入)
这是它发生的实际源示例.起初我以为MAX和ABS的定义可能有问题(也许MAX(ABS,ABS)并不总能做你期望的事情?)...但是用断言和调试器挖掘,我最终发现它是缺失的初始化 - 浮点数偶尔会初始化为非零值非常有用):
float crossedVectorX = ... // generates a float
float crossedVectorY = ... // generates a float
float infitesimal; // no manual init
float smallPositiveFloat = 2.0 / MAX( ABS(crossedVectorX), ABS(crossedVectorY));
// NB: confirmed with debugger + assertions that smallPositiveFloat was always positive
infitesimal += smallPositiveFloat;
NSAssert( infitesimal >= 0.0, @"This is sometimes NOT TRUE" );
Run Code Online (Sandbox Code Playgroud) 我有时(随机)得到不正确的值初始化,这让我觉得我在某处使用了未初始化的内存.我的主要数据结构是:
template <class state>
class learnedStateData {
public:
learnedStateData() :gCost(DBL_MAX), hCost(0), isDead(false) {}
state theState;
double gCost;
double hCost;
bool isDead;
};
Run Code Online (Sandbox Code Playgroud)
这存储在STL hash_map中.关于如何从这个数据结构中获取未初始化数据(除了theState)的任何想法?
让我澄清一下:我不希望我的价值观未被初始化,但它们似乎有时是随机的.
我最初写了一些像这样的代码:
class Foo
{
public:
Foo() : m_buffer()
{}
private:
char m_buffer[1024];
};
Run Code Online (Sandbox Code Playgroud)
比我更聪明的人说使用m_buffer()初始化程序会将内存清零.我的意图是保持记忆不被初始化.我没有时间进一步讨论它,但它激起了我的好奇心.
以前,我曾认为总是在初始化列表中列出每个成员是明智的.
有人可以进一步描述这种行为吗?
1)为什么empty-paren初始化程序会填充内存?
2)它只适用于POD数据类型吗?我听说是这样,但没有标准的方便.
谢谢