文章总结: 本文介绍C++中不使用宏实现幂运算符的方法。利用解引用运算符优先级高于乘法,通过重载operator和全局operator,将ab解析为a*(b)。针对初版破坏乘法逻辑的问题,引入PowProxy代理类区分运算重载,实现了语法糖与功能兼容的改进方案。 综合评分: 95 文章分类: 安全开发
【赤石C++】不使用宏,实现一个幂运算符
原创
crackme.net crackme.net
crackme安全实验室
2026年2月1日 13:13 河南
这个幂运算符和我以前发的“逆序成员访问运算符”有异曲同工之妙
【赤石C++】不使用宏,实现一个“逆序”的成员访问运算符
在C++中,解引用运算符优先级高于乘法运算符,所以语句 a ** b 本质上是 a * (*b)
- • 先对
b执行解引用 - •
b解引用的结果和a相乘
好了,看过上一篇文章的肯定有思路了
幂运算符
首先,创建一个类 MyInt 用于包装 int 类型(解引用运算符不能作用于基本类型,所以必须用类包装一下基本类型)
struct MyInt {
int value;
};
然后,重载 MyInt 的解引用运算符,使其返回一个和自身相等的新类
struct MyInt {
int value;
MyInt operator*() const noexcept {
return MyInt{ value };
}
};
最后,全局重载乘法运算符
MyInt operator*(const MyInt& base, const MyInt& exp) noexcept {
return MyInt{ static_cast<int>(std::pow(base.value, exp.value)) };
}
完整代码:
#include <cmath>
#include <iostream>
struct MyInt {
int value;
MyInt operator*() const noexcept {
return MyInt{ value };
}
};
MyInt operator*(const MyInt& base, const MyInt& exp) noexcept {
return MyInt{ static_cast<int>(std::pow(base.value, exp.value)) };
}
std::ostream& operator<<(std::ostream& os, const MyInt& my) {
os << my.value;
return os;
}
int main() {
MyInt two{ 2 }, three{ 3 };
MyInt result = two ** three;
std::cout << two << " ** " << three << " = " << result << std::endl;
}
更好的实现
你可能发现了,将乘法运算符重载为计算幂后会影响正常的乘法
MyInt pow = two ** three;
// 会影响正常的乘法运算
MyInt multiply = two * three;
因此,创建一个额外的类PowProxy显然是更好的实现
- •
MyInt解引用后返回PowProxy - • 添加两个全局乘法重载,一个正常计算乘法,另一个接收
PowProxy计算幂
#include <cmath>
#include <iostream>
struct PowProxy {
int exp;
};
struct MyInt {
int value;
PowProxy operator*() const noexcept {
return PowProxy{ value };
}
};
MyInt operator*(const MyInt& base, const PowProxy& pow) noexcept {
return MyInt{ static_cast<int>(std::pow(base.value, pow.exp)) };
}
MyInt operator*(const MyInt& a, const MyInt& b) noexcept {
return MyInt{ a.value * b.value };
}
std::ostream& operator<<(std::ostream& os, const MyInt& my) {
os << my.value;
return os;
}
int main() {
MyInt two{ 2 }, three{ 3 };
MyInt pow = two ** three;
MyInt multiply = two * three;
std::cout << two << " ** " << three << " = " << pow << std::endl;
std::cout << two << " * " << three << " = " << multiply << std::endl;
}
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:crackme安全实验室 crackme.net crackme.net《【赤石C++】不使用宏,实现一个幂运算符》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论