我可以在堆上创建新结构而无需定义构造函数吗?

时间:2010-12-13 04:12:36

标签: c++ coding-style struct memory-management heap

据我所知,c ++中的结构和类之间的差异很小(两个?)。尽管如此,我已经被指示使用结构来定义简单的小东西,例如可能不需要成员函数的节点(尽管事实上我可以在技术上包括include成员函数)。例如,我可以将节点定义为链表类的私有成员,如下所示:

class LinkedList {
  struct Node {
    MyObject *data;
    Node *next;
  };

  Node *list;

};

但是,在这种情况下,是否可以在堆上创建此结构的新实例,还是需要定义构造函数?有没有办法在没有new运算符的情况下在堆上创建东西?或者,更好的是:我是否没有必要紧紧抓住我不应该为结构定义成员函数的概念?我应该继续定义一个吗?或者如果我这样做,是否会承认Node真的应该是一个内部类,而不是内部结构?我真的应该担心这些事吗?哪个更具可读性?

谢谢!

5 个答案:

答案 0 :(得分:5)

  

但是,在这种情况下,是否可以在堆上创建此结构的新实例,还是需要定义构造函数?有没有办法在没有new运算符的情况下在堆上创建东西?

如前所述,您可以通过new或malloc在堆上创建新实例。

  

或者,更好的是:我是否没有必要紧紧抓住我不应该为结构定义成员函数的概念?

这是一个更有趣的问题。 c ++中structclass之间的主要(仅?)差异是 默认访问说明符。也就是说,struct默认为公共访问,class默认为私有。在我看来,这是差异,应该决定你使用哪两个。基本上,如果用户应该直接访问成员,那么它应该是struct

例如,如果您没有成员函数,那么显然目的是直接访问对象的成员,因此它将是struct。如果一个对象只是一个小的私有帮助器来实现它的外部类,就像在你的例子中那样,那么即使它有成员函数,它通常也是最容易允许外部类访问的对其成员而言应该是struct。通常使用这些类,外部类的实现与内部类的实现紧密耦合,因此没有理由将它们隐藏在另一个类中。

因此,对于琐碎的(例如std :: pair)对象或那些使用受限的对象(如在私有内部类中),对成员的默认访问可能是一件好事,在这些情况下我会使它们{{1 }}

答案 1 :(得分:4)

Malloc工作正常:

Node *n = (Node*)malloc(sizeof(*n));

请记住free()任何malloc()'和delete任何new'd。

答案 2 :(得分:2)

即使您没有定义构造函数,编译器也会创建一个默认构造函数,因此您可以使用运算符'new':

Node *n = new Node;

AFAIAC,结构是一个类,除了它的“公共性”默认是相反的。

答案 3 :(得分:2)

  

但是,在这种情况下,是否可以在该结构上创建此结构的新实例   堆,还是需要定义构造函数?

是的,您可以在堆上创建它而无需定义构造函数。

  

有没有办法在没有new运算符的情况下在堆上创建东西?

你可以使用'malloc',在释放内存时使用'free'。否则别无他法。

  

或者,更好的是:我是否没有必要紧紧抓住我的观念   不应该为结构定义成员函数?

就个人而言,如果我需要我的struct具有成员函数,我将其更改为一个类。我倾向于使用结构,因为可能会在OCaml中使用记录。

答案 4 :(得分:1)

  

我真的应该担心这些事情吗?

是。正如你所说,结构和类之间确实没有重要的区别。如果您被告知要创建struct,并且它至少需要一个成员函数,那么定义成员函数

这真的没什么大不了的。

但除此之外,你当然可以在没有构造函数的情况下堆分配结构(否则malloc在C语言中会毫无意义。该语言甚至都没有构造函数)

鉴于struct S,您只需拨打new Snew S(),具体取决于您想要的初始化类型。如果你没有定义构造函数,编译器会为你创建一个。