我可以在堆上创建一个新结构而不定义构造函数吗? 我理解C++和C++中结构和类之间的差别很小。尽管如此,我还是被指示使用结构来定义一些简单的小东西,比如可能不需要成员函数的节点(尽管在技术上我可以包含成员函数)。例如,我可以将节点定义为链表类的私有成员,如下所示: class LinkedList { struct Node { MyObject *data; Node *next; }; Node *list; };
但是,在这种情况下,是否可以在堆上创建此结构的新实例,或者是否需要定义构造函数?有没有一种方法可以在没有新操作符的情况下在堆上创建东西?或者,更好的是:我是否没有必要紧紧抓住不应该为结构定义成员函数的概念?我应该继续定义一个吗?或者,如果我这样做了,这会不会像承认那个节点实际上是一个内部类,而不是一个内部结构?我真的应该担心这些事情吗?哪个更可读 谢谢 Malloc工作正常:我可以在堆上创建一个新结构而不定义构造函数吗? 我理解C++和C++中结构和类之间的差别很小。尽管如此,我还是被指示使用结构来定义一些简单的小东西,比如可能不需要成员函数的节点(尽管在技术上我可以包含成员函数)。例如,我可以将节点定义为链表类的私有成员,如下所示: class LinkedList { struct Node { MyObject *data; Node *next; }; Node *list; };,c++,coding-style,struct,memory-management,heap,C++,Coding Style,Struct,Memory Management,Heap,但是,在这种情况下,是否可以在堆上创建此结构的新实例,或者是否需要定义构造函数?有没有一种方法可以在没有新操作符的情况下在堆上创建东西?或者,更好的是:我是否没有必要紧紧抓住不应该为结构定义成员函数的概念?我应该继续定义一个吗?或者,如果我这样做了,这会不会像承认那个节点实际上是一个内部类,而不是一个内部结构?我真的应该担心这些事情吗?哪个更可读 谢谢 Malloc工作正常: Node *n = (Node*)malloc(sizeof(*n)); 只要记住free()anythingmall
Node *n = (Node*)malloc(sizeof(*n));
只要记住
free()
anythingmalloc()
'd和delete
anythingnew
'd.即使您没有定义构造函数,编译器也会创建一个默认构造函数,因此您可以使用运算符“new”:
Node *n = new Node;
在AFAIAC中,结构是一个类,除了它的“公共性”默认值是相反的
但是,在这种情况下,是否可以在上创建此结构的新实例
堆,还是我需要定义一个构造函数
是的,您可以在堆上创建它,而无需定义构造函数
有没有一种方法可以在没有新操作符的情况下在堆上创建东西
您可以使用“malloc”,释放内存时使用“free”。否则就没有别的办法了
或者,更好的是:我是否没有必要紧紧抓住我认为
不应该为结构定义成员函数吗
就我个人而言,如果我需要我的结构具有成员函数,我会将其更改为类。我倾向于使用结构,就像在OCaml中使用记录一样
我真的应该担心这些事情吗
对。正如您所说,结构和类之间确实没有重要的区别。如果您被告知创建一个结构
,并且它至少需要一个成员函数,那么请定义一个成员函数
这真的没什么大不了的
但除此之外,您当然可以在没有构造函数的情况下堆分配结构(否则,malloc
在C中毫无意义。该语言甚至没有构造函数)
给定一个struct S
,您只需调用new S
或new S()
,具体取决于您需要的初始化类型。如果您没有定义构造函数,编译器会为您创建一个
但是,在这种情况下,是否可以在堆上创建此结构的新实例,或者是否需要定义构造函数?有没有一种方法可以在没有新操作符的情况下在堆上创建东西
如前所述,您可以通过new或使用malloc在堆上创建新实例
或者,更好的是:我是否没有必要紧紧抓住不应该为结构定义成员函数的概念
这是一个更有趣的问题。C++中的<>代码>结构> <代码>和<代码>类< /代码>之间的主要区别(仅)
默认访问说明符。也就是说,struct
默认为公共访问,class
默认为私有访问。在我看来,这是应该决定你使用哪一个的区别。基本上,如果用户应该直接访问成员,那么它应该是一个struct
例如,如果没有成员函数,那么很明显,目的是直接访问对象的成员,因此它将是一个结构。在一个对象的情况下,它只是实现其外部类的一个小的私有助手,如您的示例中所示,那么即使它有成员函数,也通常最清楚地允许外部类访问其成员,因此它应该是一个结构
。通常,对于这些类,外部类的实现与内部类的实现紧密耦合,因此没有理由对另一个隐藏一个
因此,对于普通对象(如std::pair)或使用受限的对象(如在私有内部类中),默认访问成员可能是一件好事,在这些情况下,我会让它们成为structs
你应该提到,如果有构造函数,malloc不会运行构造函数。free也不会调用析构函数:),而calloc
也会执行memset(0)
但在我的例子中,结构有指针节点:默认构造函数会使它们指向NULL吗?@Ziggy:No;隐式声明的默认构造函数将使所有指针成员保持未初始化状态。如果希望初始化构造函数,则应该声明自己的构造函数。(或者,您可以使用new
(即newnode()
)的值初始化形式)。如果你没有A,考虑买一个。