重载Operator =作为成员函数

Overloading Operator = as a member function

本文关键字:成员 函数 Operator 重载      更新时间:2023-10-16

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的某些构造函数。