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

3
我编写了一个名为NumberS的类,只是为了演示。我重载了operator+运算符。当使用两个操作数应用该运算符时,它是OK的,但是当使用更多的操作数应用时会产生未定义的结果。以下是代码:
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+"5" +"6";发生了未定义的结果,我期望结果为33,请帮助我找到正确的方法。
2个回答

4
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.

我明白了!非常感谢你! - StephenKhoa

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

你是指 friend NumberS operator+(...) 吗? - songyuanyao

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接