C++使用运算符重载判断素数 如何在operator++(int)中返回flag值
C++运算符重载实现素数判断问题解答
核心问题梳理
你当前对运算符重载的语法规则和使用场景存在明显误解,现有代码存在多处语法和逻辑错误:
- 后置
operator++(int)的int参数是固定占位符,仅用于区分前置和后置重载,无法用来传递待判断的数值 - 构造函数中写的
prime operator++(prime y);是函数声明语句,不是运算符调用逻辑,不会执行任何计算 - 类成员变量
y/z/i全程没有正确赋值,计算逻辑访问的都是未初始化的垃圾值 - 素数判断的逻辑本身有误,当前统计因数的循环和判断条件完全不符合素数判定规则
逐个问题解答
1. 如何让operator++(int)返回flag值
运算符重载的返回值类型可以自定义,你现在定义的是prime operator++(int),自然只能返回prime类对象。如果要返回flag的int值,直接把返回值类型改成int即可:
// 修改返回值类型为int int operator++(int) { int flag = 0; // 这里写计算逻辑 return flag; }
但要注意,后置++的int参数不能传参,你无法通过这个参数传入待判断的数值,这个设计本身就行不通。
2. 现有语法正确性和场景适配性
- 现有代码语法错误很多,除了前面提到的运算符调用写成声明、参数规则错误外,构造函数里的switch分支逻辑位置错误,default分支之后的输入语句永远不会执行,素数计算逻辑访问未初始化的成员变量,完全无法正常运行。
- 当前场景完全不适合使用运算符重载:运算符重载的核心原则是贴合运算符本身的语义,++运算符的原生语义是数值自增,你用来做素数判断属于滥用,代码可读性极差,完全没有必要用运算符重载实现这个功能,直接写普通成员函数即可。
3. 预期逻辑的修正方案
你设想的两个运算符重载的方案本身不符合C的运算符重载规则,单目运算符不支持传入额外的prime类型参数。如果要实现你的需求,建议直接放弃运算符重载,写普通的素数判断成员函数,参数传入待判断的数值即可。
可运行的修正代码
#include <iostream> using namespace std; class PrimeChecker { private: int ch, ans; // 单独写素数判断函数,参数传待判断的数,返回bool表示是否是素数 bool is_prime(int num) { if (num <= 1) return false; for (int j = 2; j * j <= num; j++) { if (num % j == 0) return false; } return true; } public: PrimeChecker() { do { cout << "1. Check a no to be prime\n"; cout << "2. Prime no <100\n"; cout << "Enter your choice\n"; cin >> ch; switch(ch) { case 1: { int y; cout << "Enter the number to check: "; cin >> y; if(is_prime(y)) cout<<"the given no. "<<y<<" is a prime no."<<endl; else cout<<"the given no. "<<y<<" is not a prime no."<<endl; break; } case 2: { cout<<"the primes numbers below 100 are:"<<endl; for(int i=2;i<100;i++) { if(is_prime(i)) cout<<i << " "; } cout << endl; break; } default: { cout<<"wrong choice"<<endl; } } cout<<"press 0 to continue or 1 to exit."<<endl; cin>>ans; }while(ans==0); } }; int main() { PrimeChecker op; return 0; }
内容的提问来源于stack exchange,提问作者Adin Shahab
相关产品推荐
相关产品推荐

