繁体   English   中英

重载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. 并且由于这个原因,你可以将overload = operator仅作为成员函数。

如果C ++已经定义了=运算符,那么为什么其他运算符如+ - etc ...不是由C ++定义的,因为它们可以作为非成员函数重载。

编译器为所有未定义自己的类生成默认的复制赋值运算符(operator =)。 这意味着在任何情况下都不会选择全局过载。

=运算符(当用作初始化时)与构造函数紧密相关; 当你编写SomeClass a = b; 调用SomeClass一些构造函数。

因为赋值对任何类型都有明确的含义,其他运算符则没有。

看起来很难从类外部实现operator =()而不需要引用特定的实现和私有成员。

然而,像'+'这样的运营商有时必须在全球范围内定义。 考虑一个复数类。 我可以在我的类中定义complex :: operator +(float),但是我必须从外部定义operator +(float,complex),因为第一个操作数没有我的类的类型。

编辑 :我还应该提到,通过使用类中定义的其他运算符,通常很容易定义像operator +这样的全局运算符,而无需参考特定的实现细节。 例如:

complex operator+(float lhs, complex rhs) {return complex(lhs, 0)+rhs;}

为了扩大@ ildjarn的评论,全球内置的语义=被普遍设置; 在使用某种rvalue初始化类的新实例时调用它,并调用相应的构造函数(基于rvalue的编译时类型),这是提供c样式初始化而不是严格的好方法要求通过显式调用构造函数来初始化所有变量。 重载全局运算符会改变语言的基本语义,同时提供很少的知识真正的好处 - 你将从根本上改变如何调用构造函数,调用构造函数,以及如果你觉得你有理由通过重载全局=做到这一点,你错了很有可能。

类成员operator=是可重载的,因为它在其类的已存在且已初始化的左值上运行,并且在很明显的情况下,您需要自定义行为来修改预先存在的对象(例如仅从右值复制某些成员)重新计算其他人,让其他人独自离开,或者妥善处理指针所占用的资源,以便在不泄漏记忆的情况下掌握新资源。

在成员operator=处理一个完整的左值对象的情况下,内置的东西只是一个适当大小的内存块和一个右值。 所有形状和形式的构造函数都是语言提供的接口,用于修改内置=的行为,而不会将语义本身控制给您。 我有兴趣看看你认为你需要通过重载global =来完成你无法用构造函数完成的事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM