重载Operator =作为成员函数
Overloading Operator = as a member function
c++允许将=
操作符重载为成员函数,而不是全局函数。
Bruce Eckel说if it was possible to define operator= globally, then you might attempt to redefine the built-in = sign.
,由于这个原因,你只能将= operator重载为成员函数。
如果c++已经定义了=
操作符,那么为什么其他操作符如+
-
等…因为它们可以作为非成员函数被重载,所以不是c++定义的。div ?
编译器为所有没有定义自己的类生成一个默认的复制赋值操作符(operator=)。这意味着在任何情况下都不会选择全局重载。
因为赋值对于任何类型都有明确的含义,所以其他操作符就没有了。
似乎很难在不参考特定实现和私有成员的情况下从类外部实现operator=()。
然而,像'+'这样的操作符有时必须在全局级别定义。考虑一个复数类。我可以在类内部定义complex::operator+(float),但是我必须从外部定义operator+(float, complex),因为第一个操作数没有我的类的类型。
Edit:我还应该提到,通过使用类中定义的其他操作符,通常很容易定义像operator+这样的全局操作符,而无需参考特定的实现细节。例如:
complex operator+(float lhs, complex rhs) {return complex(lhs, 0)+rhs;}
为了扩展@ildjarn的注释,全局内置=
的语义被普遍设置;在初始化具有某种右值的类的新实例时调用它,并调用适当的构造函数(基于右值的编译时类型),这是提供c风格初始化的好方法,而不是严格要求通过显式调用构造函数来初始化所有变量。重载全局操作符会改变太多语言的底层语义,而提供的实际好处却很少——你将从根本上改变如何调用、调用哪个函数以及是否调用构造函数,如果你觉得有理由通过重载全局=
来这样做,那么很有可能你错了。
类成员operator=
是可重载的,因为它操作的是类中已经存在并初始化的左值,并且在一些明显的情况下,您希望在修改预先存在的对象时使用自定义行为(例如仅从右值中复制某些成员,同时重新计算其他成员,而不影响其他成员,或者适当地处置指针持有的资源,以便在不泄漏内存的情况下占有新资源)。
成员operator=
处理的是一个完整的左值对象,则内置对象开始时只有一个适当大小的内存块和一个右值。所有形状和形式的构造函数都是语言提供的接口,用于修改内置=
的行为,而不会将语义本身的控制权交给您。我很有兴趣看看你觉得你需要通过重载全局=
来完成什么,这不能用构造函数完成。
=
操作符(当用作初始化时)与构造函数紧密相关;当您编写SomeClass a = b;
代码时,会调用SomeClass
的某些构造函数。
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 将公共但非静态的成员函数与ALGLIB集成
- 使用指向成员的指针将成员函数作为参数传递
- 将重载的成员函数传递给函数模板
- 我不小心调用了一个没有自己类对象的成员函数.但这是怎么回事呢
- 如何在C++中使用非静态成员函数作为回调函数
- C++错误C2600:无法定义编译器生成的特殊成员函数(必须首先在类中声明)
- 关联容器的下界复杂性:成员函数与非成员函数
- 在 C++ 中用派生类型重写成员函数
- 链表的泛型函数remove()与成员函数remove)
- 如何将lambda作为模板类的成员函数参数
- constexpr构造函数需要常量成员函数时出现问题
- 将自由函数绑定为类成员函数
- 区分非成员函数和头文件中的成员函数
- 如何从子成员函数修改父公共成员变量
- 保留对其他类的成员函数的引用
- 在运算符重载定义中使用成员函数(const错误)
- 内联如何影响模块接口中的成员函数
- 将成员函数指针作为参数传递给模板方法