C++中如何将重载的阶乘逻辑非运算符改为后缀调用(i!替代!i)?
能否实现
i!形式的后缀阶乘调用? 不行,C语法不支持这种写法。原因是!在C中是单目前缀运算符,语言语法规则限定它只能出现在操作数的左侧,无法通过运算符重载将其改为后缀形式使用,编译器会直接报错,因为无法解析i!这种语法结构。
替代实现方案
如果想要接近后缀形式的调用体验,可以参考以下两种方式:
1. 重载无参后缀operator()
给Integer类添加无参的operator()重载,用i()的形式模拟后缀调用:
#ifndef INTEGER_H #define INTEGER_H // 修正原代码的拼写错误:原宏定义写成了INTEGET_H template <typename T> T factorial(T t) { if (t <= 1) // 补充0的阶乘处理,0!也等于1 return 1; return t * factorial(t - 1); } class Integer { private: int value; public: Integer(int v) : value{v} {}; int getValue() const { return value; } // 原有前缀!运算符 void operator!() { value = factorial(value); } // 新增后缀风格的调用运算符 void operator()() { value = factorial(value); } }; #endif
测试代码可改为:
#include <iostream> #include "Integer.h" using namespace std; int main() { Integer i{5}; i(); // 类似后缀的调用形式 cout << i.getValue() << endl; // 输出120 }
2. 定义明确的成员函数
直接命名一个成员函数,比如calcFactorial(),可读性更高:
class Integer { private: int value; public: Integer(int v) : value{v} {}; int getValue() const { return value; } void calcFactorial() { value = factorial(value); } };
测试代码:
Integer i{5}; i.calcFactorial(); cout << i.getValue() << endl;
内容的提问来源于stack exchange,提问作者gfxmoda
相关产品推荐
相关产品推荐

