自增自减运算符重载
increment and decrement operator overloading
这是我一直试图解决的问题:
Define a class named PrimeNumber that stores a prime number. The default constructor should set the prime number to 1. Add another constructor that allows the caller to set the prime number. Also, add a function to get the prime number. Finally, overload the prefix and postfix ++
and -- operators
so they return a PrimeNumber
object that is the next largest prime number (for ++
) and the next smallest prime number (for --
). For example, if the object's prime number is set to 13, then invoking ++
should return a PrimeNumber
object whose prime number is set to 17. Create an appropriate test program for the class.
#include <iostream>
#include <cstdlib>
using namespace std;
class PrimeNumber
{
public:
PrimeNumber() : pNum(1) {}
PrimeNumber(int setNum) : pNum(setNum) {}
int getNum() const { return pNum; }
PrimeNumber operator ++(); //prefix
PrimeNumber operator ++(int ignoreMe); //postfix
PrimeNumber operator --();
PrimeNumber operator --(int ignoreMe);
bool isPrime(const int& num);
private:
int pNum;
};
int main( )
{
int x;
cout << "enter prime number => ";
cin >> x;
PrimeNumber p(x);
PrimeNumber hold = p++;
cout << "Value of hold => " << hold.getNum() << endl;
cout << "Value of p => " << p.getNum() << endl;
cout << "enter prime number => ";
cin >> x;
PrimeNumber p2(x);
PrimeNumber hold2 = ++p2;
cout << "Value of hold2 => " << hold2.getNum() << endl;
cout << "Value of p2 => " << p2.getNum() << endl;
cout << "enter prime number => ";
cin >> x;
PrimeNumber p3(x);
PrimeNumber hold3 = p3--;
cout << "Value of hold3 => " << hold3.getNum() << endl;
cout << "Value of p3 => " << p3.getNum() << endl;
cout << "enter prime number => ";
cin >> x;
PrimeNumber p4(x);
PrimeNumber hold4 = --p4;
cout << "Value of hold4 => " << hold4.getNum() << endl;
cout << "Value of p4 => " << p4.getNum() << endl;
return 0;
}
bool PrimeNumber::isPrime(const int& num)
{
if (num < 2)
{
return false;
}
else if (num == 2)
{
return true;
}
else
{
for (int i = 2; i <= num / 2; i++)
{
if (num % i == 0)
{
return false;
}
}
}
return true;
}
PrimeNumber PrimeNumber::operator ++() //prefix
{
pNum += 1;
while (!isPrime(pNum))
{
pNum++;
}
return pNum;
}
PrimeNumber PrimeNumber::operator ++(int ignoreMe) //postfix
{
int temp = pNum += 1;
while (!isPrime(pNum))
{
temp = pNum;
pNum++;
}
return temp;
}
PrimeNumber PrimeNumber::operator --() //prefix
{
pNum -= 1;
while (!isPrime(pNum))
{
pNum--;
}
return pNum;
}
PrimeNumber PrimeNumber::operator --(int ignoreMe) //postfix
{
int temp = pNum -= 1;
while (!isPrime(pNum))
{
temp = pNum;
pNum--;
}
return temp;
}
此问题与递减运算符重载有关。我认为增量运算符按预期工作。如果没有,请指出。但是,对于后缀递增和递减操作,hold
值似乎并不像预期的那样。如何解决这个问题。另外,如有其他错误,请指出。
Output Expected Output
---------- -------------------
enter prime number => 11 enter prime number => 11
Value of hold => 12 Value of hold => 11
Value of p => 13 Value of p => 13
enter prime number => 11 enter prime number => 11
Value of hold2 => 13 Value of hold2 => 13
Value of p2 => 13 Value of p2 => 13
enter prime number => 11 enter prime number => 11
Value of hold3 => 8 Value of hold3 => 11
Value of p3 => 7 Value of p3 => 7
enter prime number => 11 enter prime number => 11
Value of hold4 => 7 Value of hold4 => 7
Value of p4 => 7 Value of p4 => 7
PrimeNumber PrimeNumber::operator --(int ignoreMe) //postfix
{
int temp = pNum -= 1;
while (!isPrime(pNum))
{
temp = pNum;
temp--;
}
return temp;
}
此代码将永远 运行,因为循环内的 pNum 没有改变。您的程序在最后一次输入后挂起,试图执行后缀 operator--
。
编辑
您的后缀运算符:
PrimeNumber PrimeNumber::operator --(int ignoreMe) //postfix
{
int temp = pNum -= 1;
while (!isPrime(pNum))
{
temp = pNum;
pNum--;
}
return temp;
}
仍然无效。这是正确的版本恕我直言:
PrimeNumber PrimeNumber::operator --(int ignoreMe) //postfix
{
int temp = pNum;
while (!isPrime(--pNum)) {}
return temp;
}
oprator++(int)
相同:
PrimeNumber PrimeNumber::operator ++(int ignoreMe) //postfix
{
int temp = pNum;
while (!isPrime(++pNum)) {}
return temp;
}
所以您的代码存在一些基本问题。
- 一般来说,我们希望前缀运算符return对自身的引用。
- 您的 return 值通常会调用不必要的隐式 PrimeNumber 构造函数。
这是您可以遵循的基本规则:
前缀样式:根据情况进行自增或自减,然后return *this
.
后缀风格:通过auto copy = *this
创建自己的副本,然后调用适当的前缀运算符。
让我们尝试实现这个:
PrimeNumber & PrimeNumber::operator ++() //prefix
{
pNum += 1;
while (!isPrime(pNum))
pNum++;
return *this;
}
PrimeNumber PrimeNumber::operator ++(int ignoreMe) //postfix
{
auto copy = *this;
++(*this);
return copy;
}
PrimeNumber & PrimeNumber::operator --() //prefix
{
pNum -= 1;
while (!isPrime(pNum))
pNum--;
return *this;
}
PrimeNumber PrimeNumber::operator --(int ignoreMe) //postfix
{
auto copy = *this;
--(*this);
return copy;
}
此外,测试代码在给出错误结果时应该抛出断言等。我不应该去考虑一个测试是对还是错。
int main( ) {
auto x = PrimeNumber(17);
auto hold = x++;
assert(hold.getNum() == 17);
assert(x.getNum() == 19);
x = PrimeNumber(18);
hold = x--;
assert(hold.getNum() == 18);
assert(x.getNum() == 17);
x = PrimeNumber(25);
hold = ++x;
assert(hold.getNum() == 29);
assert(x.getNum() == 29);
x = PrimeNumber(19);
hold = --x;
assert(hold.getNum() == 17);
assert(x.getNum() == 17);
cout << "Success!\n"
}
这个 main()
只有在所有断言都为真时才会打印 Success!
。
这是我一直试图解决的问题:
Define a class named PrimeNumber that stores a prime number. The default constructor should set the prime number to 1. Add another constructor that allows the caller to set the prime number. Also, add a function to get the prime number. Finally, overload the prefix and postfix
++
and-- operators
so they return aPrimeNumber
object that is the next largest prime number (for++
) and the next smallest prime number (for--
). For example, if the object's prime number is set to 13, then invoking++
should return aPrimeNumber
object whose prime number is set to 17. Create an appropriate test program for the class.
#include <iostream>
#include <cstdlib>
using namespace std;
class PrimeNumber
{
public:
PrimeNumber() : pNum(1) {}
PrimeNumber(int setNum) : pNum(setNum) {}
int getNum() const { return pNum; }
PrimeNumber operator ++(); //prefix
PrimeNumber operator ++(int ignoreMe); //postfix
PrimeNumber operator --();
PrimeNumber operator --(int ignoreMe);
bool isPrime(const int& num);
private:
int pNum;
};
int main( )
{
int x;
cout << "enter prime number => ";
cin >> x;
PrimeNumber p(x);
PrimeNumber hold = p++;
cout << "Value of hold => " << hold.getNum() << endl;
cout << "Value of p => " << p.getNum() << endl;
cout << "enter prime number => ";
cin >> x;
PrimeNumber p2(x);
PrimeNumber hold2 = ++p2;
cout << "Value of hold2 => " << hold2.getNum() << endl;
cout << "Value of p2 => " << p2.getNum() << endl;
cout << "enter prime number => ";
cin >> x;
PrimeNumber p3(x);
PrimeNumber hold3 = p3--;
cout << "Value of hold3 => " << hold3.getNum() << endl;
cout << "Value of p3 => " << p3.getNum() << endl;
cout << "enter prime number => ";
cin >> x;
PrimeNumber p4(x);
PrimeNumber hold4 = --p4;
cout << "Value of hold4 => " << hold4.getNum() << endl;
cout << "Value of p4 => " << p4.getNum() << endl;
return 0;
}
bool PrimeNumber::isPrime(const int& num)
{
if (num < 2)
{
return false;
}
else if (num == 2)
{
return true;
}
else
{
for (int i = 2; i <= num / 2; i++)
{
if (num % i == 0)
{
return false;
}
}
}
return true;
}
PrimeNumber PrimeNumber::operator ++() //prefix
{
pNum += 1;
while (!isPrime(pNum))
{
pNum++;
}
return pNum;
}
PrimeNumber PrimeNumber::operator ++(int ignoreMe) //postfix
{
int temp = pNum += 1;
while (!isPrime(pNum))
{
temp = pNum;
pNum++;
}
return temp;
}
PrimeNumber PrimeNumber::operator --() //prefix
{
pNum -= 1;
while (!isPrime(pNum))
{
pNum--;
}
return pNum;
}
PrimeNumber PrimeNumber::operator --(int ignoreMe) //postfix
{
int temp = pNum -= 1;
while (!isPrime(pNum))
{
temp = pNum;
pNum--;
}
return temp;
}
此问题与递减运算符重载有关。我认为增量运算符按预期工作。如果没有,请指出。但是,对于后缀递增和递减操作,hold
值似乎并不像预期的那样。如何解决这个问题。另外,如有其他错误,请指出。
Output Expected Output
---------- -------------------
enter prime number => 11 enter prime number => 11
Value of hold => 12 Value of hold => 11
Value of p => 13 Value of p => 13
enter prime number => 11 enter prime number => 11
Value of hold2 => 13 Value of hold2 => 13
Value of p2 => 13 Value of p2 => 13
enter prime number => 11 enter prime number => 11
Value of hold3 => 8 Value of hold3 => 11
Value of p3 => 7 Value of p3 => 7
enter prime number => 11 enter prime number => 11
Value of hold4 => 7 Value of hold4 => 7
Value of p4 => 7 Value of p4 => 7
PrimeNumber PrimeNumber::operator --(int ignoreMe) //postfix
{
int temp = pNum -= 1;
while (!isPrime(pNum))
{
temp = pNum;
temp--;
}
return temp;
}
此代码将永远 运行,因为循环内的 pNum 没有改变。您的程序在最后一次输入后挂起,试图执行后缀 operator--
。
编辑
您的后缀运算符:
PrimeNumber PrimeNumber::operator --(int ignoreMe) //postfix
{
int temp = pNum -= 1;
while (!isPrime(pNum))
{
temp = pNum;
pNum--;
}
return temp;
}
仍然无效。这是正确的版本恕我直言:
PrimeNumber PrimeNumber::operator --(int ignoreMe) //postfix
{
int temp = pNum;
while (!isPrime(--pNum)) {}
return temp;
}
oprator++(int)
相同:
PrimeNumber PrimeNumber::operator ++(int ignoreMe) //postfix
{
int temp = pNum;
while (!isPrime(++pNum)) {}
return temp;
}
所以您的代码存在一些基本问题。
- 一般来说,我们希望前缀运算符return对自身的引用。
- 您的 return 值通常会调用不必要的隐式 PrimeNumber 构造函数。
这是您可以遵循的基本规则:
前缀样式:根据情况进行自增或自减,然后return
*this
.后缀风格:通过
auto copy = *this
创建自己的副本,然后调用适当的前缀运算符。
让我们尝试实现这个:
PrimeNumber & PrimeNumber::operator ++() //prefix
{
pNum += 1;
while (!isPrime(pNum))
pNum++;
return *this;
}
PrimeNumber PrimeNumber::operator ++(int ignoreMe) //postfix
{
auto copy = *this;
++(*this);
return copy;
}
PrimeNumber & PrimeNumber::operator --() //prefix
{
pNum -= 1;
while (!isPrime(pNum))
pNum--;
return *this;
}
PrimeNumber PrimeNumber::operator --(int ignoreMe) //postfix
{
auto copy = *this;
--(*this);
return copy;
}
此外,测试代码在给出错误结果时应该抛出断言等。我不应该去考虑一个测试是对还是错。
int main( ) {
auto x = PrimeNumber(17);
auto hold = x++;
assert(hold.getNum() == 17);
assert(x.getNum() == 19);
x = PrimeNumber(18);
hold = x--;
assert(hold.getNum() == 18);
assert(x.getNum() == 17);
x = PrimeNumber(25);
hold = ++x;
assert(hold.getNum() == 29);
assert(x.getNum() == 29);
x = PrimeNumber(19);
hold = --x;
assert(hold.getNum() == 17);
assert(x.getNum() == 17);
cout << "Success!\n"
}
这个 main()
只有在所有断言都为真时才会打印 Success!
。