通常,数据结构的有效初始化是将所有成员设置为零.即使使用C++进行编程,也可能需要与外部API进行交互.
以下是否有任何实际区别:
some_struct s;
memset(&s, 0, sizeof(s));
Run Code Online (Sandbox Code Playgroud)
简单地说
some_struct s = { 0 };
Run Code Online (Sandbox Code Playgroud)
人们发现自己都使用这两种方法,选择哪种方法更适合给定的应用程序?(希望据了解,这只适用于POD结构;如果该结构中存在C++ std :: string,则会遇到各种各样的破坏.)
对于我自己来说,作为一个不使用memset的C++程序员,我从不确定函数签名,所以我发现第二个例子更容易使用,除了更少打字,更紧凑,甚至更多很明显,因为它在声明中说"这个对象被初始化为零"而不是等待下一行代码并且看到"哦,这个对象初始化为零".
在C++中创建类和结构时,我倾向于使用初始化列表; 我很好奇人们对上面两个"C风格"初始化的想法,而不是与C++中可用的内容进行比较,因为我怀疑我们很多人都与C库接口,即使我们自己主要用C++编写代码.
编辑: Neil Butterworth 在后续提出这个问题,我认为这是这个问题的一个有趣的推论.
我使用map作为ID - > value的关联数组,其中值是定义对象的结构:
#include <map>
struct category {
int id;
std::string name;
};
std::map<int, category> categories;
int main() {
categories[1] = {1, "First category"};
categories[2] = {2, "Second category"};
}
Run Code Online (Sandbox Code Playgroud)
上面的代码用g ++编译,但有以下警告:
warning: extended initializer lists only available with -std=c++0x or -std=gnu++0x
Run Code Online (Sandbox Code Playgroud)
我在这里阅读了关于struct初始化的各种问题/答案,但我仍然有点困惑.我有一系列相关问题:
我可以添加编译器选项-std = c ++ 0x并完成警告,但仍然没有更明智的基础问题.如果我在类别结构中添加方法,事情会不会破裂?
以更符合C++ 03的方式初始化此POD结构(类别)的最佳方法是什么?
基本上,我还不确定以某种方式而不是另一种方式做事的后果.这种关联数组(其中关键是对象的ID)的很容易与PHP,我还在学习正确的方法做它在C++.在上面的代码中是否有任何我应该注意的事项?
编辑
下面的问题是相关的,但是当我第一次看到他们,我不明白的答案:
c + +初始化匿名结构
的C++初始化结构与数组作为成员
用C初始化结构++
如何抑制类型的自动初始化和销毁?虽然T buffer[100]自动初始化所有元素buffer并在它们超出范围时销毁它们是很棒的,但这不是我想要的行为.
#include <iostream>
static int created = 0,
destroyed = 0;
struct S
{
S()
{
++created;
}
~S()
{
++destroyed;
}
};
template <typename T, size_t KCount>
class fixed_vector
{
private:
T m_buffer[KCount];
public:
fixed_vector()
{
// some way to suppress the automatic initialization of m_buffer
}
~fixed_vector()
{
// some way to suppress the automatic destruction of m_buffer
}
};
int main()
{
{
fixed_vector<S, 100> arr;
}
std::cout << "Created:\t" << created …Run Code Online (Sandbox Code Playgroud)