C ++允许仅将=
运算符重载为成员函数而不是全局函数。
Bruce Eckel说if it was possible to define operator= globally, then you might attempt to redefine the built-in = sign.
并且由于这个原因你可以将= = operator仅作为成员函数。
如果C ++已经定义了=
运算符,那么为什么像+
-
等其他运算符不是由C ++定义的,因为它们可以作为非成员函数重载。 ?
答案 0 :(得分:4)
编译器为所有未定义自己的类生成默认的复制赋值运算符(operator =)。这意味着在任何情况下都不会选择全局过载。
答案 1 :(得分:0)
=
运算符(用作初始化时)与构造函数紧密相关;当您编码SomeClass a = b;
时,会调用SomeClass
的某个构造函数。
答案 2 :(得分:0)
因为赋值对任何类型都有明确的含义,其他运算符则没有。
答案 3 :(得分:0)
要扩展@ ildjarn的注释,全局内置=
的语义是普遍设置的;在使用某种rvalue初始化类的新实例时调用它,并调用相应的构造函数(基于rvalue的编译时类型),这是提供c样式初始化而不是严格的好方法要求通过显式调用构造函数来初始化所有变量。重载全局运算符会改变语言的基本语义,同时提供很少的知识真正的好处 - 你将从根本上改变如何调用构造函数,调用构造函数,以及如果你觉得你有理由通过重载全局=
来做到这一点,很有可能你错了。
类成员operator=
是可重载的,因为它在其类的已存在且已初始化的左值上运行,并且在很明显的情况下,您需要自定义行为来修改预先存在的对象(例如仅复制rvalue中的某些成员在重新计算其他成员并将其他人留下时,或者正确处理指针所占用的资源以获取新资源而不会泄露内存)。
如果成员operator=
处理一个完整的左值对象,那么内置函数只能从适当大小的内存块和右值开始。 所有形状和形式的构造函数都是语言提供的接口,用于修改内置=
的行为,而不必将语义本身控制给您。我有兴趣看到你觉得你需要通过重载全局=
来完成你无法用构造函数完成的事情。