2014-06-27 44 views
1

我正在經歷一些C++賦值運算符的理論。C++中的運算符重載如何工作

比方說

class MyClass { 
private: 
    T1 member1; 
    T2 member2; 
public: 
    // The default copy assignment operator which assigns an object via memberwise copy 
    MyClass & operator=(const MyClass & rhs) { 
     member1 = rhs.member1; 
     member2 = rhs.member2; 
     return *this; 
    } 
...... 
} 

c7 = c6; //member wise copy assignment. 

在這裏,我們正在返回賦值操作過程中參照對象,併爲其分配新的對象c7

但是,如果我在我的代碼是有點像這樣:

int a=12; 
    int &b=a; 
    int c=&b;  //error::invalid conversion from ‘int*’ to ‘int’ 

這是爲什麼從上述情況不同?

回答

6

聲明

int& b = a; 

b聲明爲基準,並使其引用該變量a

聲明

int c = &b; 

聲明c是一個正常的int變量,然後嘗試將其初始化的指針int。取決於上下文,符號&做了不同的事情。


至於拷貝賦值運算符,它當你在一個聲明中初始化的變量調用,而不是它的拷貝構造函數被調用。


當你有一個複製賦值操作符,

MyClass a, b; 

a = b; // Copy-assignment operator called 

編譯器基本上替換以下調用

a.operator=(b); 

換句話說分配,這是一個正常的成員函數調用,就像任何其他。

+0

@Pileborg你能簡單地解釋在操作員分配的情況下會發生什麼嗎?謝謝。 – starkk92

+0

@ starkk92看到我更新的答案。 –

0

您的操作符重載不合適。之所以這樣說,是你的操作符重載代碼 -

class ABC: 
{ 
public: 
    ABC(); 

    bool operator==(const ABC& ip) const 
    { 
     if((this->a == ip.a) && 
      (this->b == ip.b)) 
     { 
      return true; 
     } 

     return false; 
    } 



    ~ABC(); 

int a,b; 

}; 

現在你可以做以下 -

ABC x,y; 
// do new or other operations. 
if (x==y) 
{return true;} 
else return false; 

這裏我們只重載運算符(==),其他運營商可以以同樣的方式被重載。

2
c7 = c6; //member wise copy assignment. 

你說:

在這裏,我們的 轉讓操作過程中返回參照對象,併爲其分配新的對象C7。

這不是返回一個引用並將其分配給c7。它在c7上調用operator =,參照c6的rhs參數。

operator =需要返回引用的原因是,賦值的結果可以用於另一個表達式(通常是另一個賦值,但可以是任何表達式)。所以,你可以做

c8 = c7 = c6; 

它將調用operator =在C7與rhs指C6,然後調用operator =在C8與分配的結果(這將是返回參考C7,根據您的代碼) 。