在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};
答案 0 :(得分:6)
是的,你是对的。
假设node
是汇总,your C++ version is right(模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;
默认构造虽然有一些后果。您可能不需要任何构造函数。
答案 1 :(得分:1)
在C ++中,你可以避免使用裸新的,并在C ++ 11/14中使用std::make_shared / std::make_unique创建共享/唯一指针,或者将分配封装在{后面的句柄类中{3}}成语。
举一个如何运作的例子:
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}
在编写构造函数时,请务必注意RAII。