如何在C++中新建和初始化结构
How can I new and initialize a struct in C++?
在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}
在编写构造函数时,一定要注意三/五规则。
相关文章:
- 在C和C++中初始化结构中的数组
- 我们可以用参数化构造函数初始化结构的数组吗?
- 尝试初始化结构内的联合时出错
- 使用其他成员初始化结构的成员?
- 使用构造函数初始化结构还是在之后设置其值更好?
- 如果不初始化结构中的向量,它会自动为空还是具有随机内存位置的值?
- 如何在另一个结构中初始化结构数组?
- 如何在构造函数中初始化结构体的动态数组?
- 初始化结构中的联合 - c++
- 尝试初始化结构向量时出现编译错误
- 用于初始化结构的 void 指针强制转换
- 初始化结构的两种方式
- 使用用户定义的构造函数初始化C++结构
- 使用初始值设定项列表初始化结构,对于 std::array 失败
- 在 c++ 中初始化结构的指针
- 无序列图会创建一个零初始化结构吗?
- 如何在C++中初始化结构
- C 用结构指针初始化结构
- 在C 中初始化结构数组
- 使用数组聚合初始化结构数组