如何简写非交换乘法?C++中非交换变量乘法有无简写方式?
在C++中实现非交换左乘的简写方案
好问题!在标准C++的内置语法里,确实没有现成的运算符简写能直接对应a = b * a这种左乘操作——毕竟*=运算符的语义是固定的a = a * b(右乘),没法直接修改它的默认行为。不过针对自定义的非交换类型(比如矩阵、四元数这类乘法不满足交换律的结构),我们有几种可行的方案来实现类似简写的效果:
1. 自定义成员函数(推荐)
如果你的非交换逻辑是封装在自定义类里的,最清晰的方式是给类添加一个命名明确的成员函数,比如left_multiply:
class Matrix { public: // 假设已经实现了 operator* 用于矩阵乘法 Matrix operator*(const Matrix& other) const; // 实现左乘:this = other * this void left_multiply(const Matrix& other) { *this = other * *this; } }; // 使用方式 Matrix a, b; a.left_multiply(b); // 等价于 a = b * a
这种方式可读性拉满,任何看代码的人都能立刻明白这是左乘操作,完全没有歧义。
2. 重载现有运算符(谨慎使用)
C++不允许自定义全新的运算符,但你可以重载一些不常用的现有运算符来模拟左乘简写——比如%=(取模赋值),前提是这个运算符在你的类里原本没有意义:
class Matrix { public: Matrix operator*(const Matrix& other) const; // 重载 %= 作为左乘赋值 Matrix& operator%=(const Matrix& other) { *this = other * *this; return *this; } }; // 使用方式 Matrix a, b; a %= b; // 等价于 a = b * a
⚠️ 注意:这种方式虽然简洁,但会降低代码的直观性,除非你的团队有统一的约定,否则不推荐使用——毕竟别人看到%=第一反应是取模,而不是左乘。
3. 宏定义(不推荐)
如果你只是想快速实现简写,也可以用宏,但宏存在类型不安全、容易引发意外副作用的问题,现代C++里一般不建议使用:
#define LEFT_MUL(a, b) (a = b * a) // 使用方式 Matrix a, b; LEFT_MUL(a, b); // 等价于 a = b * a
比如如果a或b是带副作用的表达式(比如LEFT_MUL(a++, b)),宏展开后会出现意料之外的行为,所以尽量避免这种方式。
最后想说的
其实如果不是高频使用左乘操作,直接写a = b * a反而最清晰——毕竟代码的可读性永远是第一位的,没必要为了“简写”而牺牲易懂性。只有当你需要频繁执行左乘时,再考虑上面的成员函数方案。
内容的提问来源于stack exchange,提问作者Jack Avante
相关产品推荐
相关产品推荐

