重载运算符+;在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();
代码将输出4。因此,我正在使用以下代码重载全局运算符+:重载运算符+;在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
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的帮助,我不可能明白这一点。谢谢你们!