为什么对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类型数据的副本?由于我是该语言的新手,所以我想我误会了一些东西。     
已邀请:
使用
X
而不是
X *
的优点是,对于指针,您还必须为
X
分配空间,这将使用更多空间(指针需要4字节或8字节,再加上为指针分配的开销)。
X
new
),而对于普通类型,则避免了这种开销。因此,仅使用普通的
X
比较简单。 如果您绝对不想复制
X
值,则可以使用指针,但是如果不小心,可能会导致指针悬空。如果在某些情况下可能没有指向的对象,则还可以使用指针。 摘要 使用直接对象简化内存管理。 当您负担不起复制或需要表示缺少值时,请使用指针。     
不同之处在于,指针指向尚未分配或确定的内存块。但是,当您不使用*时,您是在说“为整个类(不仅是指向类的指针)以及该类分配了空间。” 前者使用指针将所有内存分配和维护交给您。后者只是为您提供该对象作为您班级的成员。 前者不占用太多空间(取决于体系结构是什么,四到八个字节?)后者可以使用多达LOT的空间,具体取决于类X作为其成员的空间。     
在以下情况下,我将使用非指针数据成员:1)我确定该数据不应且不会在对象之间共享2)在最终销毁对象之后,我可以依靠自动释放。一个很好的例子是包装器(包装的东西):
class Wrapper
{
private:
    Wrapped _wrapped;
public:
    Wrapper(args) : _wrapped(args) { }
}
    
主要区别在于,如果声明一个“ 10”,则您负责堆上的内存管理(“ 6”和“ 12”),而使用“ 2”时,则在堆栈上处理内存,因此将使用范围来分配/释放该内存。 。 还有其他一些细微的事情,例如担心分配给自己等。     

要回复问题请先登录注册