运算符重载多个操作数C++
operator overloading multiple operands C++
我已经编写了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;
}
相关文章:
- 控制允许动态运行c++的并发操作数
- 为什么C++逐位AND运算符在不同大小的操作数中表现为这样
- 错误 C2679:二进制"<<":未找到采用类型 'std::string_view' 的右侧操作数的运算符(或者没有可接受的转换)
- C++ 带有向量的 IF 计算操作数
- 是否所有C++运算符都接受操作数?
- 一元*运算符的操作数是否期望一个 prvalue
- 与'operator='不匹配(操作数类型'String'且"void")
- 不正确的操作数类型 MSVC
- C2678 二进制 '==':未找到采用 'Card' 类型左操作数的运算符(或者没有可接受的转换)
- 错误:类型"double()"和"double()"的操作数无效到二进制&quo
- 我的运算符重载是否有效<<(流插入)左操作数不是 ostream
- 没有运算符"="与这些操作数匹配,JUCE 窗口演示应用程序
- 如果我在指针中使用 ++ 操作数,我的值就会出错
- 二进制表达式的操作数无效 - 使用 for 和迭代器
- C2679 二进制"<<":未找到采用右操作数类型的运算符
- CPP 运算符重载操作数位置 [] 与 ==
- int* 和 int[] 类型对二进制运算符 + 的操作数无效
- 错误:二进制'operator*' 'float'和'float[0]'类型的操作数无效
- 运算符'<'不能应用于类型 'string' 和 'string' 的操作数
- 非法,左操作数具有类型 'DWORD [29]'