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

时间:2018-05-17 01:27:01

标签: c++ operator-overloading

我编写了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 请帮我把它弄到正确的方式

2 个答案:

答案 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;
}