2011-03-01 229 views
0

我們可以將賦值運算符重載爲正常函數,但我們不能將賦值運算符重載爲友元函數。爲什麼?重載賦值運算符

回答

4

由於C++標準是這樣說的,第13.5.3/1:

賦值運算符應 由非靜態成員 函數正好與一個參數實現。 由於複製賦值運算符 運算符=是隱式聲明要 類,如果不能由用戶 (12.8),基站類別指派 操作者總是由派生類 的拷貝 賦值運算符隱藏聲明。

這就是你真正需要知道的。朋友函數不是成員函數,因此它不能用於重載賦值運算符。

0

如果你想寫:

MyClassObject = MyFriendObject;

然後,你會想要實現一個構造函數,它接受一個友元類的const引用作爲它的參數。

0

由朋友功能和由成員函數重載重載之間的差異是調用對象必須在重載由成員函數第一個操作數,而存在由朋友功能重載沒有限制。這是標準背後的原因。同樣,需要第一個操作數作爲調用函數的一些其他操作符必須使用成員函數(例如:=, [], ->,())進行重載。

0

你不能「擴展」賦值運算符與「免費功能」之類外,但你可以設計類,因此將允許它:

Data.h

class Data { 
public: 
    Data& operator=(const Data& lhs) { /*...*/; return *this; } 
    template <typename T> Data& operator=(const T& lhs) { 
     return assign(*this, lhs); // Magic right here... 
    } 
private: 
    // ... 
}; 

Point.h

class Point { 
public: 
    float x,y; 
    Point& operator=(const Point& lhs) { x = lhs.x, y = lhs.y; return *this; } 
    template <typename T> Point& operator=(const T& lhs) { 
     return assign(*this, lhs); // Magic right here... 
    } 
}; 

Assignment.h

Data& assign(const Data& lhs, const Point& rhs) { 
    lhs["x"] = rhs.x; 
    lhs["y"] = rhs.y; 
    return lhs; 
} 

Point& assign(const Point& lhs, const Data& rhs) { 
    rhs.query("x", lhs.x) || rhs.query(0, lhs.x); 
    rhs.query("y", lhs.y) || rhs.query(1, lhs.y); 
    return lhs; 
}