相关疑难解决方法(0)

以下短语在C++中的含义是什么:零,默认和值初始化?

以下短语在C++中的含义是什么:

  • 零初始化,

  • 默认初始化,和

  • 值初始化

C++开发人员应该了解他们什么?

c++ initialization c++-faq

183
推荐指数
2
解决办法
3万
查看次数

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.

c++ initialization default-value

22
推荐指数
1
解决办法
5342
查看次数

C++中POD类型的默认初始化

我知道默认情况下会初始化一些POD变量,但其他变量不是.(POD类型包括int,float指针,联合,POD类型的数组,POD类型的结构等)

范围和存储类如何影响POD类型的默认初始化?

具体而言,将隐式初始化以下哪项:

  • 具有自动存储的局部变量
  • 静态局部变量
  • 静态全局变量
  • 外部变量
  • 分配的变量 new
  • 类的POD成员(没有在构造函数中显式初始化)

我知道存在一些与这些情况有关的问题,但没有全面的问题(它们只涉及具体情况).

c++ initialization pod

13
推荐指数
2
解决办法
1万
查看次数

枚举类默认初始化

枚举类的默认初始化/构造是否定义了行为?

这是一个最小的示例(在线试用

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查询了此信息,但没有找到有关它的任何相关信息-是否也可以获得标准参考?

c++ c++11

8
推荐指数
2
解决办法
1288
查看次数

什么是在C中默认初始化的基本类型?

我只是让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)

c ios llvm-3.0

7
推荐指数
3
解决办法
2186
查看次数

C++未初始化的内存?

我有时(随机)得到不正确的值初始化,这让我觉得我在某处使用了未初始化的内存.我的主要数据结构是:

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)的任何想法?

让我澄清一下:我不希望我的价值观未被初始化,但它们似乎有时是随机的.

c++

5
推荐指数
0
解决办法
3068
查看次数

C++ empty-paren成员初始化 - 将内存清零?

我最初写了一些像这样的代码:

class Foo
{
public:
  Foo() : m_buffer()
    {}

private:
  char   m_buffer[1024];
};
Run Code Online (Sandbox Code Playgroud)

比我更聪明的人说使用m_buffer()初始化程序会将内存清零.我的意图是保持记忆不被初始化.我没有时间进一步讨论它,但它激起了我的好奇心.

以前,我曾认为总是在初始化列表中列出每个成员是明智的.

有人可以进一步描述这种行为吗?

1)为什么empty-paren初始化程序会填充内存?

2)它只适用于POD数据类型吗?我听说是这样,但没有标准的方便.

谢谢

c++ standards initialization

3
推荐指数
1
解决办法
1275
查看次数

标签 统计

c++ ×6

initialization ×4

c ×1

c++-faq ×1

c++11 ×1

default-value ×1

ios ×1

llvm-3.0 ×1

pod ×1

standards ×1