运算符重载多个操作数C++

operator overloading multiple operands C++

本文关键字:操作数 C++ 重载 运算符      更新时间:2023-10-16

我已经编写了NumberS类,它只是为了演示。我重载了运算符+。当应用具有 2 个操作数的运算符时,这是可以的,但使用更多操作数应用会产生未定义的结果。代码如下

数字S.h

#include <string>
#include <iostream>
using namespace std;
class NumberS
{
private:
long long number;
void assign(long long);
public:
NumberS();
NumberS(long long);
void operator=(string);
NumberS& operator+(string);
friend ostream& operator<<(ostream &os,NumberS numb)
{
os<<to_string(numb.number);
return os;
}
};
int main()
{
NumberS number(5);
number="10";
cout<<number<<"n";//print out 10
number=number+"12";
cout<<number<<"n";//print out 22
number=number+"5" +"6";//<-----   wrong result occured here, I want it to be 33
cout<<number<<"n";
getchar();
}

数字.cpp

#include "NumberS.h"
NumberS::NumberS()
{
number=0;
}
void NumberS::assign(long long numb)
{
number=numb;
}
NumberS::NumberS(long long numb)
{
assign(numb);
}
void NumberS::operator=(string str)
{
assign(stoi(str));
}
NumberS& NumberS::operator+(string str)
{
NumberS s;
s.operator=(str);
s.assign(number+s.number);
return s;
}

未定义的结果发生在行号=数字+"5"+"6";,我预计结果为 33 请帮助我以正确的方式

NumberS::operator+

通过引用返回,但你返回的是s,它是一个局部变量,当离开operator+时会被销毁,返回的引用总是悬空的。之后,对它的任何取消引用都会导致 UB,一切皆有可能。

对于您的情况,按值返回会很好。

NumberS NumberS::operator+(string str)
{
NumberS s;
s.operator=(str);
s.assign(number+s.number);
return s;
}

顺便说一句:大多数编译器都会对这种情况发出警告,例如 clang:

prog.cc:54:12: warning: reference to stack memory associated with local variable 's' returned [-Wreturn-stack-address]
return s;
^
1 warning generated.
NumberS& operator+=(string s)&{
NumberS num=std::move(s);
this->assign(number+s.number);
return *this;
}
friend NumberS operator(NumberS lhs, string s) {
lhs += std::move(s);
return lhs;
}