重载运算符+;在C++; < >我正在通过一本书学习C++操作符重载。我创建了一个BigInt类,它为构造函数接受一个int(最初设置为0)。我重载了+=方法,它在以下代码中运行良好: BigInt x = BigInt(2); x += x; x.print( cout ); BigInt operator+(const BigInt lhs, const BigInt rhs) { BigInt returnValue(lhs); returnValue += rhs; return returnValue; } BigInt x = BigInt(1); BigInt y = BigInt(5); BigInt z = x + y; z.print();

重载运算符+;在C++; < >我正在通过一本书学习C++操作符重载。我创建了一个BigInt类,它为构造函数接受一个int(最初设置为0)。我重载了+=方法,它在以下代码中运行良好: BigInt x = BigInt(2); x += x; x.print( cout ); BigInt operator+(const BigInt lhs, const BigInt rhs) { BigInt returnValue(lhs); returnValue += rhs; return returnValue; } BigInt x = BigInt(1); BigInt y = BigInt(5); BigInt z = x + y; z.print();,c++,operators,operator-overloading,C++,Operators,Operator Overloading,代码将输出4。因此,我正在使用以下代码重载全局运算符+: BigInt x = BigInt(2); x += x; x.print( cout ); BigInt operator+(const BigInt lhs, const BigInt rhs) { BigInt returnValue(lhs); returnValue += rhs; return returnValue; } BigInt x = BigInt(1); BigInt y = BigIn

代码将输出4。因此,我正在使用以下代码重载全局运算符+:

BigInt x = BigInt(2);
x += x;
x.print( cout );
BigInt operator+(const BigInt lhs, const BigInt rhs)
{
    BigInt returnValue(lhs);
    returnValue += rhs;
    return returnValue;
}
BigInt x = BigInt(1);
BigInt y = BigInt(5);
BigInt z = x + y;
z.print();
这也适用于以下代码:

BigInt x = BigInt(2);
x += x;
x.print( cout );
BigInt operator+(const BigInt lhs, const BigInt rhs)
{
    BigInt returnValue(lhs);
    returnValue += rhs;
    return returnValue;
}
BigInt x = BigInt(1);
BigInt y = BigInt(5);
BigInt z = x + y;
z.print();
这张打印出6张。但是,当我尝试执行以下代码时,它就是不起作用。这本书没有很好地解释,暗示它应该简单地起作用

BigInt x = BigInt(1);
BigInt z = x + 5;
z.print();

这个打印出1。我不知道为什么z应该是6,而z是1。我在网上和stackoverflow上搜索过,但我找不到任何其他人有这样的问题。有些很接近,但答案并不合适。非常感谢您的帮助

在向BigInt添加int时需要重载;示例中的常量5是int类型,而不是BigInt。像这样的方法应该会奏效:

BigInt operator+(const BigInt lhs, const int rhs)
{
    BigInt returnValue(rhs);
    returnValue += lhs;
    return returnValue;
}

您可能还需要一个用于
操作符+(const int lhs,const BigInt rhs)

最可能的问题是
+=
操作符。发布代码。

您发布的代码看起来不错,应该可以使用。您看到的问题几乎可以肯定是由于BigInt类的复制构造函数或赋值运算符造成的。

以下超级简化代码(我可以添加的最小值,用于包含所有代码并使其成为有效的独立可执行程序):


请对此工作代码进行尽可能小的修改,以重现您观察到的错误——这当然会显示您的错误确切位置。

编译的代码意味着到
BigInt
的转换工作正常(通过隐式转换)。为什么代码要编译和打印
1
?这对我来说没有意义。是的,除非有一个非
显式
构造函数接受
int
,即提供从
int
BigInt
的转换,否则需要三个
操作符+
重载@kevingessner,
int
之前的
const
在参数列表中是无用的。另一方面,返回类型可能应该是
const BigInt
,以避免像
a+b=c这样的废话。我认为这与您的问题无关,但为了效率起见(也因为它在C++中是惯用的),
操作符+
的参数应该通过常量引用而不是值来获取,例如
BigInt操作符+(const-BigInt&lhs,const-BigInt&rhs)
我一直想知道的一件事是:为什么要编写
=BigInt(1) 
而不仅仅是
=1
?我认为如果您向我们展示完整的类定义,我们可以更好地帮助您:)我同意泰勒的观点。也更习惯于初始化为
BigInt x(1)你这样做的方式是创建一个临时的,然后调用复制ctor(尽管这可能会得到优化)。文本“5”不是BigInt(错误的类型)。@Tyler。事实上,最好的选择是按值获取
lhs
,按常量引用获取
rhs
(如果要在函数内部复制
lhs
,只需将该副本移动到接口。如果
lhs
是临时的,这将为编译器提供删除副本的机会),@Johannes Schaub说得对,他说它是通过隐式强制转换的方式转换的(很多断点和代码跟踪都为我找到了一个断点)。问题实际上在+=运算符中。如果没有早些时候的评论和@aaa的帮助,我不可能明白这一点。谢谢你们!