簡體   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