电话
400 9058 355
重载运算符是接口设计而非语法糖,需严格遵循语义:对称运算符用非成员函数(常配friend),修改状态的用成员函数,流操作符只能是非成员;返回类型、const正确性及隐式转换控制至关重要。
重载运算符不是语法糖,是接口设计——写错位置、忘掉 const、返回类型不对,编译器不会帮你兜底,只会报一串你看不懂的错误。
核心区别在左操作数是否可修改、是否需要隐式转换:
operator+、operator== 这类对称运算符,推荐用**非成员函数**(常配合 friend),否则右操作数无法触发用户定义的隐式转换operator+=、operator++(前置/后置)、operator[] 必须是**成员函数**,因为要修改当前对象状态operator 和 operator>> **只能是非成员函数**,因为左操作数是 std::ostream/std::istream,你不能给标准库类加成员void 或局部对象运算符语义决定了返回什么:

operator+= 应返回 *this(T&),支持链式调用:a += b += c;
operator+ 应返回 T(值语义),不是 T&——否则可能返回局部对象引用,导致悬垂引用operator[] 通常返回 T&(非常量版本)和 const T&(常量版本),否则无法对元素赋值或在 const 对象上调用operator== 必须返回 bool,且建议声明为 const 成员或接受两个 const T&
operator++(int))怎么写才不翻车?后置递增必须带 int 形参(仅作标记,不使用),且行为上要「先返回旧值,再自增」:
T T::operator++(int) {
T old = *this; // 拷贝当前状态
++(*this); // 复用前置递增逻辑(推荐)
return old; // 返回旧副本
}
常见错误:
int,编译器会当成前置版本,导致重定义错误*this 而不是拷贝,结果和前置行为一样operator++()
如果你写了 MyString(const char*) 构造函数但没加 explicit,又重载了 operator+,那么 "hello" + mystr 就可能意外触发构造 + 运算符调用,性能差还难调试。
explicit
MyString("hello") + mystr
std::string_view 参数替代 const char*,减少临时对象构造最常被忽略的是 const 正确性:90% 的 operator==、operator[](const 版)、operator* 等只读操作,漏加 const 会导致无法在 const 对象上调用——这不是警告,是硬性编译失败。
邮箱:8955556@qq.com
Q Q:8955556
本文详解如何将Go官方present工具(用于生成HTML5...
PySNMP在不同版本中对SNMP错误状态(errorSta...
time.Sleep仅阻塞当前goroutine,其他gor...
PHPfopen()创建含特殊符号的文件名失败主因是操作系统...
WooCommerce中通过代码为分组产品动态聚合子商品的属...
io.ReadFull返回io.ErrUnexpectedE...
本文详解Yii2中控制器向视图传递ActiveRecord数...
本文详解为何通过wp_set_object_terms()为...
Pytest中使用@mock.patch类装饰器会导致补丁泄...
带缓冲的channel是并发安全的FIFO队列;make(c...