编程C++开发者

什么是C++中的函数重载(Function Overloading)和运算符重载(Operator Overloading)?存在哪些限制,使用重载时的错误有什么危险?请举一个用户定义类的加法运算符重载的例子。

用 Hintsage AI 助手通过面试

回答。

函数重载是指可以创建多个具有相同名称但参数不同的函数。这用于提高可读性并确保直观的接口。

运算符重载是指定义标准运算符如何与用户定义的数据类型(类或结构)一起工作的能力。

运算符重载的限制:

  • 不是所有运算符都可以重载(.:.*::sizeof?:等)。
  • 运算符必须是成员函数或友元函数。
  • 不能完全重写语义来创建全新的语法。

加法运算符"+"的重载示例:

class Vector2D { public: float x, y; Vector2D(float _x, float _y): x(_x), y(_y) {} Vector2D operator+(const Vector2D& rhs) const { return Vector2D(x + rhs.x, y + rhs.y); } };

有陷阱的问题。

在C++中,是否允许重载逗号运算符(,),如果可以,这可以用于什么?

回答:
是的,逗号运算符可以为用户定义的类重载。
然而,重载逗号运算符应在有充分意义的情况下进行,因为这可能会使代码阅读者感到困惑并导致意外后果。

struct Logger { Logger& operator,(const std::string& msg) { std::cout << msg; return *this; } };

由于对主题细节不了解而导致的真实错误示例。


故事
在一个数学库中,重载了==运算符用于比较对象,但忘记重载<运算符。这导致在尝试使用需要比较运算符的STL容器(例如std::setstd::map)时出现编译错误。


故事
开发者为Matrix类重载了+运算符,但总是修改左操作数而不是返回新对象。结果是出现了意想不到的副作用,违反了“操作的纯洁性”原则。


故事
在重载具有不同类型参数的函数时,没有考虑到const修饰符:

void foo(SomeClass&); void foo(const SomeClass&);

这导致函数调用歧义和传递临时对象时的编译错误。