为什么对c ++字段使用非指针?
|
这些天来,我开始着迷于c ++,由于我的Java背景,显然我在理解某些c ++功能时遇到了一些问题。
由于Java仅提供引用和基元,所以对我而言,最神秘的c ++功能之一是非指针(非基元)字段。
这是我的意思的一个例子。
如果我应该用c ++编写X类型的对象列表的c ++实现,我会写类似以下内容:
class XList{
private:
struct node {
X* data;
node* next;
};
node* first;
public:
*/
a lot of methods
*/
}
这段代码可能很糟糕,我知道模板,STL和其他信息,但是这里的问题仅是字段“ data”。如果将\“ data \”声明为X指针,我认为可以以与Java引用非常相似的方式使用它。
将数据声明为X(X data;)的原因可能是相反的。有什么区别?我知道在堆栈和堆上分配之间的区别,但是这里有连接吗?
请帮助我更多地掌握这个主题。
谢谢。
-更新:----
通常,大多数答案似乎都集中于在指针上使用普通类型之间的区别。
可能我以错误的方式写了这个问题,但是我已经知道在堆栈或堆上分配之间的区别(至少是基础知识)。
我无法理解的是,根据我的观点(可能是错误的),在成员变量(不是字段,感谢您的更正)中使用普通类型应该只是某种极端情况。尤其是当涉及模板时,数据副本对我来说毫无意义。
相反,每次我看到某个数据结构的实现时,都会使用纯类型。
例如:如果您在Google上搜索\“ bst c ++ template \”,则会发现很多类似的实现:
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类型数据的副本?由于我是该语言的新手,所以我想我误会了一些东西。
没有找到相关结果
已邀请:
4 个回复
寇剩
而不是
的优点是,对于指针,您还必须为
分配空间,这将使用更多空间(指针需要4字节或8字节,再加上为指针分配的开销)。
到
),而对于普通类型,则避免了这种开销。因此,仅使用普通的
比较简单。 如果您绝对不想复制
值,则可以使用指针,但是如果不小心,可能会导致指针悬空。如果在某些情况下可能没有指向的对象,则还可以使用指针。 摘要 使用直接对象简化内存管理。 当您负担不起复制或需要表示缺少值时,请使用指针。
慷祈霖黑
屠创氓读叔
揽芳僵迷仇