[英]why to use non-pointer for c++ fields?
这些天来,我开始着迷于c ++,由于我的Java背景,显然我在理解某些c ++功能时遇到了一些问题。
由于Java仅提供引用和基元,所以对我来说,最神秘的c ++功能之一是非指针(非基元)字段。
这是我的意思的一个例子。
如果我应该用c ++编写XI类型的对象列表的c ++实现,则会编写如下内容:
class XList{
private:
struct node {
X* data;
node* next;
};
node* first;
public:
*/
a lot of methods
*/
}
这段代码可能太糟糕了,我知道模板,STL和诸如此类的东西,但是对我来说,这里的问题只是“数据”字段。 如果假定将“数据”声明为X指针,则我可以以与Java引用非常相似的方式使用它。
将数据声明为X(X data;)的原因可能是相反的。 有什么区别? 我知道在堆栈和堆上分配之间的区别,但是这里有连接吗?
请帮助我更多地掌握这个主题。
谢谢。
-更新:----
通常,大多数答案似乎都集中于在指针上使用普通类型之间的区别。
可能我以错误的方式写了这个问题,但是我已经知道在堆栈或堆上分配之间的区别(至少是基础知识)。 我无法理解的是,根据我的观点(可能是错误的),在成员变量(不是字段,感谢您的更正)中使用普通类型应该只是某种极端情况。 尤其是当涉及模板时,数据副本对我来说毫无意义。
相反,每次我看到某些数据结构的实现时,都会使用纯类型。
例如:如果您在Google上搜索“ bst c ++模板”,则会发现很多类似的实现:
template<class T>
class BinarySearchTree
{
private:
struct tree_node
{
tree_node* left;
tree_node* right;
T data;
};
tree_node* root;
public:
/*
methods, methods and methods
*/
};
您是否真的想在不知道树大小的情况下复制插入到此树上的每个T类型数据的副本? 由于我是该语言的新手,所以我想我误会了一些东西。
使用X
而不是X *
的优点在于,对于指针,您还必须为X
分配空间,这将使用更多的空间(指针需要4字节或8字节,再加上分配给指针的开销)。 X
通过new
),而使用普通类型,则可以避免这种开销。 因此,仅使用普通X
会更简单。
如果您绝对不想复制X
值,则可以使用指针,但是如果不小心,可能会导致指针悬空。 如果在某些情况下可能没有指向的对象,则还可以使用指针。
不同之处在于,指针指向尚未分配或确定的内存块。 但是当您取消*时,就是说“为整个类(不只是指向类的指针)以及该类分配了空间”。
前者使用指针将所有内存分配和维护交到您手中。 后者只是将对象作为您班级的成员。
前者不占用太多空间(取决于体系结构,为四到八个字节?),后者最多可以使用多达LOT的空间,具体取决于类X作为其成员的空间。
在以下情况下,我将使用非指针数据成员:1)我确定该数据不应且不会在对象之间共享。2)当对象被销毁时,我可以依靠自动释放。 一个很好的例子是包装器(包装的东西):
class Wrapper
{
private:
Wrapped _wrapped;
public:
Wrapper(args) : _wrapped(args) { }
}
主要区别在于,如果声明X*
,则负责堆上的内存管理( new
和delete
),而使用X
,则在堆栈上处理内存,因此将使用范围来分配/释放内存。
还有其他一些细微的事情,例如担心分配给自己等。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.