2012-04-11 111 views
4

可能重複:
What are the differences between pointer variable and reference variable in C++?
What are the distinctions between the various symbols (*,&, etc) combined with parameters?混淆引用和指針

我有一點麻煩讓我的頭周圍粘貼下面這個例子的代碼。具體來說,功能Buf& operator=(const Buf &);。據我所知,這個函數需要返回類Buf的對象的地址。出現了兩個問題:

  1. 是否同樣適用於這個聲明爲Buf* operator=(const Buf*);,因爲Buf*Buf類的一個實例的地址?如果不是,爲什麼不呢?如果是這樣,它只是編碼模式的首選?哪個更好?

  2. 在相應的函數定義中,返回*this。據我所知,this是一個指針或地址對應的Buf類的對象。因此*this是指針指向的內容,即類Buf的對象。這與返回Buf*有衝突嗎?函數應該返回this而不是*this

我想我今天有一天......請有人幫忙!

using namespace std; 

class Buf { public: 
    Buf(char* szBuffer, size_t sizeOfBuffer); 
    Buf& operator=(const Buf &); 
    void Display() { cout << buffer << endl; } 

private: 
    char* buffer; 
    size_t sizeOfBuffer; }; 

Buf::Buf(char* szBuffer, size_t sizeOfBuffer) { 
    sizeOfBuffer++; // account for a NULL terminator 

    buffer = new char[ sizeOfBuffer ]; 
    if (buffer) 
    { 
     strcpy_s(buffer, sizeOfBuffer, szBuffer); 
     sizeOfBuffer = sizeOfBuffer; 
    } } 

Buf& Buf::operator=(const Buf &otherbuf) { 
    if(&otherbuf != this) 
    { 
     if (buffer) 
      delete [] buffer; 

     sizeOfBuffer = strlen(otherbuf.buffer) + 1; 
     buffer = new char[sizeOfBuffer]; 
     strcpy_s(buffer, sizeOfBuffer, otherbuf.buffer); 
    } 
    return *this; } 

int main() { 
    Buf myBuf("my buffer", 10); 
    Buf yourBuf("your buffer", 12); 

    // Display 'my buffer' 
    myBuf.Display(); 

    // assignment opperator 
    myBuf = yourBuf; 

    // Display 'your buffer' 
    myBuf.Display(); } 
+0

這裏有您需要的'*''主場迎戰&'回答:http://stackoverflow.com/a/9637342/365496 – bames53 2012-04-11 13:27:24

回答

4

此:

Buf& operator=(const Buf &); 

返回引用到Buf對象,而不是Buf對象的地址。所以當方法返回*this時,調用者獲取對象的引用。

此: BUF *運算符=(const的BUF *);

返回一個指向Buf的指針,所以相應的函數確實會返回this。這裏

注:

Buf& b = <some code returning Buf&>; 

bBuf一個參考,而不是一個地址。在另一方面,

Buf c = ... 
Buf* pBuf = &c; 

在上述代碼&cc地址,並且可以被用於初始化pBuf,這是一個指向Buf。所以根據上下文,*&可以有不同的含義。

3

據我瞭解,這個功能預計要返回的對象類BUF的 的地址。

到BUF對象的引用號被返回,而不是地址。參考不是地址。它是一個別名 - 用來指代那個精確的對象。引用與指針不同。

我建議你谷歌的C++參考和指針,甚至更好,你讀a good C++ book這解釋了這個概念。

+1

感謝。我沒有谷歌它,但我同意,一本好書是真正我需要的。去圖書館! – LPlates 2012-04-11 13:57:44

3

Buf&不是「地址」,它是一個參考。在語法上,您只需返回一個對象,並且調用者可以訪問原始對象。在上述情況下,return *this;返回當前對象。

(請注意,它是非法的參考返回自動對象,因爲當主叫方試圖在稍後訪問他們,他們將不再存在。)

1

在幕後,引用被稱爲指向對象的指針。當您將*this作爲參考返回時,實際上將確切的對象(不帶任何複製)返回給接收它的參考。引用和指針之間的主要區別在於,您可以操作指針(如更改指向的地址),但引用不能。

例如:

int val = 4; 
int *p = &val; 
int &r = val; 

p++ // Will pointer to the next memory located to val (addr(val) + sizeof(int)) 
(*p)++ // Will NOT increment val anymore as p pointer to another location 
r++ // will increment value of val (you cannot increment the location r is pointing to). This is same as (*p)++. 

兩個pr指的是同一個內存位置(中val地址),但唯一的區別是你訪問val的價值的方式。 (*p VS r

1

,當你參考概念(SomeType&)和地址回吐操作(&SomeObject)之間的差異acquianted,你可以看看C++ FAQ,那裏是一個什麼樣的參考是怎麼一個很好的解釋你應該使用它。

+0

謝謝,我會檢查出來 – LPlates 2012-04-11 13:58:00