2011-03-15 149 views
0

爲什麼C++約運算符重載

賦值運算符必須是 非靜態成員函數

運營商(),操作符[],並且操作符 - > 也必須被實現爲非易失靜態 成員函數。

例如

class IntList 
{ 
private: 
    int m_anList[10]; 

public: 
    int& operator[] (const int nIndex); 
}; 

int& IntList::operator[] (const int nIndex) 
{ 
    return m_anList[nIndex]; 
} 

這是下標過載。它只能通過使用成員函數來重載。 它不能使用友元函數,如 超載,

class Cents 
{ 
private: 
    int m_nCents; 

public: 
    Cents(int nCents) { m_nCents = nCents; } 

    // Overload -cCents 
    friend Cents operator-(const Cents &cCents); 
}; 

// note: this function is not a member function! 
Cents operator-(const Cents &cCents) 
{ 
    return Cents(-cCents.m_nCents); 
} 
+0

向我們展示一些關於如何認爲它可能工作的代碼。最好的答案顯示並說明OP正在嘗試做什麼,並在問題發佈之前嘗試過。 – 2011-03-15 02:36:35

+0

爲什麼?因爲它的C++定義! – AbiusX 2011-03-15 02:37:39

回答

0

所有這些操作符(operator=operator()operator[]operator->)上的定義,這些運營商非類的一個實例被調用靜態成員函數!

靜態成員或非成員函數就像自由函數一樣。他們不會被調用到類的實例上。

例如,如果你讓operator[]靜態函數,那麼你沒有this指針裏面,那麼函數不知道哪個實例是應該採取行動:

//illegal code 
static int& IntList::operator[] (const int nIndex) 
{ 
    return m_anList[nIndex]; //of which instance this `m_anList` is a member? 
} 
+0

但我把「朋友」標識符放在該類中。 ? – user658266 2011-03-15 02:46:34

+0

@ user658266:'friend'關鍵字只告訴該函數可以訪問該類的私有成員。它不會自動擁有'this'指針。也就是說,如果函數是'friend',那麼你可以在函數定義中寫入'obj.privateMember'。注意它正在訪問私有成員,但它仍然需要知道'obj',以便它可以知道它正在執行哪個對象! – Nawaz 2011-03-15 02:48:32

+0

我覺得OP奇怪它爲什麼不能成爲一個自由函數:'int&operator [](IntList&,size_t);'至少這是人們在問什麼似乎是重複的問題:) :) – UncleBens 2011-03-15 07:33:57

0

他們有恰好一個參數,因爲賦值運算符是二元運算符。左側是要更改的對象,右側是指定給左側的對象。

它是非靜態的,因爲靜態成員函數不是特定於該類的單個實例,而是通用於整個類。除了單個實例之外,對任何事物做任務是沒有意義的。

0

賦值運算符(如果我沒有錯,你的意思是複製構造函數在內部)是特定於實例的。即每個對象的內容必須被複制/複製。所以它必須是非靜態的。靜態函數具有更全局的作用,所以它不能處理特定的實例。 總之,如果你有一個要求影響所有實例的功能,那麼只有靜態成員(變量和方法)必須被使用。如在計數器中保持當前可用對象的數量。

現在只有一個參數 - 這是因爲你需要創建一個副本ofsomething(儘管它已經是一個類的對象內部具有多種數據類型,它是一個單一的對象只)

類似的(),[ ]和 - >是特定於實例的。

+0

我懷疑賦值運算符等於複製構造函數。 – user658266 2011-03-15 02:53:22

+0

考慮class MyClass {....}; MyClass obj1(10); MyClass obj2 = obj1;現在這裏的意思是Obj2與obj1是類似的(即複製狀態)......賦值運算符不是一對一的複製構造函數,但可以在內部使用它。 http://en.wikipedia.org/wiki/Assignment_operator_(C%2B%2B) – Abhi 2011-03-15 04:29:45