如何在C++中新建和初始化结构

How can I new and initialize a struct in C++?

本文关键字:初始化 结构 新建 C++      更新时间:2023-10-16

在C中,我们实际上执行

struct node *p = (node*)malloc(sizeof(node));   // casting is not necessary
p->a = 0;      // first  element
p->b = NULL;   // second element

在内存中动态分配空间,但我如何用C++的方式做到这一点?

下面的线是正确的猜测吗?

node *p = new node {0, NULL};

是的,你是对的

假设node是一个聚合,那么您的C++版本是正确的(模NULL而不是nullptr)。

也就是说,如果这些初始值是"默认值",您通常会编写一个默认构造函数来自动初始化这些成员:

struct node
{
    int a;
    node* b;
    node() : a(0), b(nullptr) {}
};

然后你只需要写:

node* p = new node;

或者更好:

auto p = std::make_unique<node>();

或者,更好的是:

node n;

不过,默认构造会产生一些后果。您可能不需要任何构造函数。

在C++中,您可以避免使用裸新指针,或者在C++11/14中使用std::make_shared/std::make_unique创建一个共享/唯一指针,或者按照RAII习惯用法将分配封装在句柄类中。

举一个例子说明它是如何工作的:

class Foo {
    const int i;
    public:
    int j;
    Foo(int i) : i{i}, j{0} {}//constructor
    void foo() {std::cout << i << "n";}
};
int main() {
    unique_ptr<Foo> fp = make_unique<Foo>(5);
    fp->foo();
    return 0;
}

如果构造函数看起来有点令人困惑,请简短解释:构造函数签名后的冒号启动初始化声明。在本节中,您必须初始化const值,但您可以在那里初始化所有值。因此,接受参数的构造函数通常如下所示:

Foo(ArgType1 arg1, ArgType2 arg2,...,ArgTypeN argN) : 
   member1(arg1), member2(arg2), ... , memberN(argN) {//empty body}

在编写构造函数时,一定要注意三/五规则。