我可以在堆上创建一个新结构而不定义构造函数吗?

新手上路,请多包涵

我知道 C++ 中的结构和类之间几乎没有区别(两个?)。尽管如此,我被指示使用结构来定义简单的小东西,比如可能不需要成员函数的节点(尽管事实上我可以在技术上包含包含成员函数)。例如,我可以将节点定义为链表类的私有成员,如下所示:

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

  Node *list;

};

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

谢谢!

原文由 Ziggy 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 527
2 个回答

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

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

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

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

例如,如果您没有成员函数,那么显然目的是直接访问对象的成员,因此它将是 struct 。如果一个对象只是实现其外部类的一个小型 私有 助手,如您的示例所示,那么即使它具有成员函数,通常最清楚的是允许外部类访问其成员,因此它应该是 struct 。通常对于这些类,外部类的实现与内部类的实现紧密耦合,因此没有理由将一个隐藏起来。

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

原文由 Chris Hopman 发布,翻译遵循 CC BY-SA 2.5 许可协议

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

 Node *n = new Node;

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

原文由 Android Eve 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题