Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以在堆上创建一个新结构而不定义构造函数吗? 我理解C++和C++中结构和类之间的差别很小。尽管如此,我还是被指示使用结构来定义一些简单的小东西,比如可能不需要成员函数的节点(尽管在技术上我可以包含成员函数)。例如,我可以将节点定义为链表类的私有成员,如下所示: class LinkedList { struct Node { MyObject *data; Node *next; }; Node *list; };_C++_Coding Style_Struct_Memory Management_Heap - Fatal编程技术网

我可以在堆上创建一个新结构而不定义构造函数吗? 我理解C++和C++中结构和类之间的差别很小。尽管如此,我还是被指示使用结构来定义一些简单的小东西,比如可能不需要成员函数的节点(尽管在技术上我可以包含成员函数)。例如,我可以将节点定义为链表类的私有成员,如下所示: class LinkedList { struct Node { MyObject *data; Node *next; }; Node *list; };

我可以在堆上创建一个新结构而不定义构造函数吗? 我理解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

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

谢谢

Malloc工作正常:

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

只要记住
free()
anything
malloc()
'd和
delete
anything
new
'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,考虑买一个。