簡體   English   中英

什么是C ++中Reference和Pointer返回類型之間的區別

[英]Whats the difference between Reference and Pointer return types in C++

如果我要在C ++中創建一個簡單的對象,返回成員的地址與返回指針之間的區別是什么。 據我所知,C ++沒有自動垃圾收集,因此它不會保留引用計數。 那么為什么會有人這樣做呢:

class CRectangle {
public:
    string& getName( );
    int&    getWidth( );
    int&    getHeight( );
private:
    string  name;
    int     height;
    int     width;
};

而不是這樣:

class CRectangle {
public:
    string* getName( );
    int*    getWidth( );
    int*    getHeight( );
private:
    string  name;
    int     height;
    int     width;
};

我意識到這些將允許您訪問成員數據,但我並不關心這個簡單示例中的正確封裝。 那么差異是什么? 加速? 可讀性? 樣式?

& (在此上下文中)並不意味着“地址”。

聲明為string& getName( );函數string& getName( ); 返回引用 ,而不是指針。 引用本質上是另一個對象的別名。 因此,在這種情況下,它不會返回對象名稱的副本或指向名稱的指針,而是返回對名稱本身的引用。 因此,對返回對象的任何更改都將直接應用於對象的名稱。

您可以通過返回指針來實現相同的目標,但是存在兩個顯着差異:

  • 指針需要特殊的語法才能訪問( *->運算符),而引用的使用方式與使用對象本身完全相同。
  • 指針可以為null ,引用不能。 因此,無論何時使用指針,您都會向讀者發出“此值可能為null ”的信號。

在這種情況下, &指的是參考 - 而不是地址。

  • 指針可以是0 - 在格式良好的程序中,引用不能。
  • 返回指針時,所有權可能會更加明確。
  • 可讀性是主觀的 - 我會說盡可能使用參考。
  • 為了提高效率,沒有真正的區別。

首先,&form在C ++中稱為“引用”。 *表單稱為“指針”或“地址”。

加速 - 沒有區別。 可讀性 - 對於引用可能略有優勢,在upstack代碼中沒有derefencing。

風格 - 明確破壞封裝是足夠糟糕的風格來掩蓋任何其他東西。 如果你想要一個具有裸數據的對象,那么全公共結構也可以。

在從屬性類型方法(如getWidth()返回指向整數的指針時,我無法想到這一點。 它增加了必須跟蹤內存所有權的負擔; 但實際上可能會增加返回類型的帶寬( int和指針大小都是特定於平台的,並且可以且確實有所不同,但典型的大小分別為32位和64位)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM