C++运算符重载
C 的运算符重载Operator Overloading是其强大扩展性的体现它允许开发者赋予内置运算符如,-,*,等处理自定义类对象的能力。1. 基本规则与限制在开始编写代码前必须牢记以下“死理”不能创建新运算符你只能重载 C 语法中已有的运算符例如不能造一个 表示幂运算。不改变优先级和结合性*的优先级永远高于。至少有一个参数是类类型不能重载处理两个int的运算符。不可重载的运算符.(成员访问).*(成员指针访问)::(域解析)?:(条件运算符)sizeof,typeid,alignof2. 重载方式成员函数 vs. 非成员函数A. 成员函数重载运算符作为类的成员。第一个操作数必须是该类的对象由this指针隐式传递。CComplex operator(const Complex other) const { return Complex(this-real other.real, this-imag other.imag); }B. 非成员函数通常是友元重载如果左侧操作数不是该类的对象例如int Complex或cout Complex则必须使用非成员函数。Cfriend Complex operator(double left, const Complex right);3. 分类知识点详解3.1 算术运算符 (,-,*,/)通常返回一个新对象传值返回。建议先实现赋值运算符如再用实现以减少代码冗余。3.2 自增自减 (,--)分为前置和后置通过一个占位参数int来区分前置Complex operator()返回引用效率高后置Complex operator(int)返回原副本效率低3.3 关系运算符 (,!,,)必须返回bool类型。在 C20 中引入了“三路比较运算符”太空船运算符只需定义它编译器就能自动生成所有关系运算。3.4 赋值运算符 ()必须是成员函数。默认赋值编译器会生成浅拷贝赋值如果类中有指针必须手动重载以实现深拷贝。准则检查自赋值if (this other)返回*this的引用。3.5 流运算符 (,)必须是非成员函数。因为第一个参数是std::ostream或std::istream。Cstd::ostream operator(std::ostream os, const Complex c) { os c.real c.imag i; return os; // 支持链式调用 }3.6 函数调用运算符 (())重载后类的对象可以像函数一样被调用这种对象称为仿函数Functor。Cstruct Linear { double operator()(double x) { return a * x b; } double a, b; };4. 特殊运算符下标运算符[]通常提供const和非const两个版本。解引用运算符*和-常用于智能指针必须返回指针或支持解引用的对象。类型转换运算符例如operator bool()允许对象直接用于条件判断。建议加上explicit防止意外隐式转换。5. 最佳实践建议 (Checklist)场景推荐做法一致性含义应与内置类型保持一致别让做减法。返回类型赋值运算,返回引用算术运算,-返回新值。对称性如果a b能行那么b a也应该能行通常用非成员函数实现。效率参数尽可能使用const T以避免不必要的拷贝。