我們可以將賦值運算符重載爲正常函數,但我們不能將賦值運算符重載爲友元函數。爲什麼?重載賦值運算符
Q
重載賦值運算符
0
A
回答
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;
}
相關問題
- 1. 重載賦值運算符
- 2. 運算符超載賦值運算符
- 3. 在C++中重載賦值運算符
- 4. TypeScript中的賦值運算符重載
- 5. C++重載賦值運算符
- 6. C++賦值運算符重載
- 7. 重載賦值運算符標操作
- 8. 複合賦值運算符重載
- 9. 重載複製賦值運算符
- 10. 重載賦值運算符C++
- 11. 重載C++賦值運算符
- 12. 賦值=運算符超載
- 13. 運算符重載如何爲賦值運算符工作?
- 14. java複合賦值運算符和賦值運算符
- 15. 移動賦值運算符VS拷貝賦值運算符
- 16. 超載複合賦值運算符
- 17. MATLAB - 超載賦值運算符
- 18. 賦值運算符 - 自賦值
- 19. 重載賦值運算符和任何其他運算符有什麼區別?
- 20. 運算符在枚舉上爲組合賦值運算符重載
- 21. C++模板賦值運算符重載 - 將基元類型賦值給對象?
- 22. BigDecimal的賦值運算符
- 23. C++「| =」賦值運算符
- 24. 使用賦值運算符
- 25. 賦值運算符在
- 26. 嫩枝賦值運算符
- 27. 布爾賦值運算符
- 28. 默認賦值運算符
- 29. 布爾賦值運算符
- 30. 賦值運算符繼承