我编写了NumberS类,它仅用于演示。我重载了运营商+。应用具有2个操作数的运算符时可以,但应用更多操作数生成未定义的结果。代码在
之下NumberS.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();
}
NumberS.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;
}
未确定的结果发生在 number = number +&#34; 5&#34; +&#34; 6&#34 ;; ,我预计结果为33 请帮我把它弄到正确的方式
答案 0 :(得分:4)
NumberS::operator+
以引用形式返回,但是您返回s
,它是一个局部变量,当它离开operator+
时它将被销毁,返回的引用总是悬空。在那之后,任何取消引用它都会导致UB,一切皆有可能。
对于您的情况,按值返回会没问题。
NumberS NumberS::operator+(string str)
{
NumberS s;
s.operator=(str);
s.assign(number+s.number);
return s;
}
BTW:大多数编译器会对此案例发出警告,例如clang:
prog.cc:54:12: warning: reference to stack memory associated with local variable 's' returned [-Wreturn-stack-address] return s; ^ 1 warning generated.
答案 1 :(得分:0)
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;
}