2014-10-17 81 views
-2

碰到一個代碼。我張貼片段。什麼是運營商=返回?

Animal & Animal::operator=(const Animal & o) { 
    cout << "assignment operator" << endl; 
    if(this != &o) { 
     _type = o._type; 
     _name = clone_prefix + o._name; 
     _sound = o._sound; 
    } 
    return *this; 
} 

int main(int argc, char ** argv) { 
    Animal a; 
    a.print(); 

    const Animal b("goat", "bob", "baah"); 
    b.print(); 

    const Animal c = b; 
    c.print(); 

    a = c; 
    a.print(); 

    return 0; 

我的問題:這是他指向當前對象吧?賦值操作符返回Animal類型的對象是否正確?因爲它正在返回*這個?但是它不應該返回對象的地址,因爲它的返回類型是Animal &? 我不理解這一點。

+0

這與你對參考參數不執行'a =&c'的原因是一樣的。 – chris 2014-10-17 03:23:45

+0

如果聲明爲「Animal *」,您將返回該地址。引用與指針不同。 – Barmar 2014-10-17 03:25:39

回答

1

operator=返回Animal&,即對Animal的引用。也許你的困惑源於這樣一個事實,即&也被用來取對象的地址,即產生一個指向對象的指針。作爲類型修飾符,它的意思是「參考」。所以*this是正確的。

想一想代碼片斷:

Animal a{}; //suppose Animal has a default constructor 
Animal& b = a; 
Animal* c = &a; 
Animal& d = *c; 

a是實際的對象,而ba基準(不是指針,所以a那張右手側和a不是地址)。 c是指向a的指針,因此我們在其右側爲其指定地址a&ad也是對a的引用,但我們不是僅將它分配給a,而是取消引用c(完全等同於第二行)。想象一下this而不是c和函數的返回值而不是d而你有return *this

一般注意:operator=返回指定對象的引用是一個衆所周知的習慣用法和有用的約定,因爲它模仿了基本類型的行爲。然而,像

a = b = c 

分配的鏈接也將是可能的,如果它由返回值(即Animal代替Animal&)。但是,這會創建一個額外的副本(至少在理論上,如果編譯器由於某種原因無法優化它)。不管你怎麼做,通過值或引用返回使上述語句成爲可能,而返回指針則不行。如果operator=返回指向Animal的指針,即Animal*,那麼您的課程的用戶將非常困惑。