繁体   English   中英

为什么对c ++字段使用非指针?

[英]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值,则可以使用指针,但是如果不小心,可能会导致指针悬空。 如果在某些情况下可能没有指向的对象,则还可以使用指针。

摘要

  1. 使用直接对象简化内存管理。
  2. 当您负担不起复制或需要表示缺少值时,请使用指针。

不同之处在于,指针指向尚未分配或确定的内存块。 但是当您取消*时,就是说“为整个类(不只是指向类的指针)以及该类分配了空间”。

前者使用指针将所有内存分配和维护交到您手中。 后者只是将对象作为您班级的成员。

前者不占用太多空间(取决于体系结构,为四到八个字节?),后者最多可以使用多达LOT的空间,具体取决于类X作为其成员的空间。

在以下情况下,我将使用非指针数据成员:1)我确定该数据不应且不会在对象之间共享。2)当对象被销毁时,我可以依靠自动释放。 一个很好的例子是包装器(包装的东西):

class Wrapper
{
private:
    Wrapped _wrapped;
public:
    Wrapper(args) : _wrapped(args) { }
}

主要区别在于,如果声明X* ,则负责堆上的内存管理( newdelete ),而使用X ,则在堆栈上处理内存,因此将使用范围来分配/释放内存。

还有其他一些细微的事情,例如担心分配给自己等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM