我们可以将赋值运算符重载为正常函数,但我们不能将赋值运算符重载为友元函数。为什么?重载赋值运算符
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. C++重载赋值运算符
- 3. 重载C++赋值运算符
- 4. 重载赋值运算符C++
- 5. 赋值=运算符超载
- 6. 移动赋值运算符VS拷贝赋值运算符
- 7. MATLAB - 超载赋值运算符
- 8. 赋值运算符 - 自赋值
- 9. 运算符在枚举上为组合赋值运算符重载
- 10. PHP赋值运算符=&
- 11. 赋值运算符在
- 12. 嫩枝赋值运算符
- 13. 赋值运算符继承
- 14. 默认赋值运算符
- 15. BigDecimal的赋值运算符
- 16. 为什么在VB.NET中赋值运算符不可重载?
- 17. 如何在C++中重载赋值运算符?
- 18. 模板赋值运算符重载神秘
- 19. 重载赋值运算符总线错误
- 20. 您是否可以重载Delphi记录的赋值运算符?
- 21. 重载赋值运算符以返回std :: vector
- 22. 如何在Python中模拟赋值运算符重载?
- 23. C++赋值运算符=用派生类重载
- 24. 基于类型名称重载专门的赋值运算符
- 25. 初始化程序列表和赋值重载(运算符=)
- 26. 重载赋值运算符而没有返回语句
- 27. 在重载赋值运算符中调用构造函数?
- 28. 在CUDA内核中重载赋值运算符
- 29. 重载赋值运算符指向两个不同的类
- 30. 赋值运算符重载:void返回回访参考参数