关于运算符重载的查询,复数上的简单代码示例,添加
An inquiry on operator overloading, example simple code on complex numbers, adding
class Complex
{
private:
float re;
float im;
public:
Complex(float r = 0.0, float i = 0.0) : re(r), im(i){}
friend Complex operator+(Complex c1, Complex c2);
};
Complex operator+(Complex c1, Complex c2)
{
return Complex(c1.re + c2.re, c1.im + c2.im);
}
int main()
{
Complex c1(1,2);
Complex c2(1,2);
Complex c3;
c3 = 1.0 + c2;
}
我不清楚为什么这会起作用,因为似乎浮点数 1.0 是运算符中的一个参数,而 c2 是另一个参数。现在我被告知这没关系,因为调用了构造函数,这有效吗?我们怎么知道,1.0 分配给 r 而不是 i ??
现在下面这些是不正确的,我问为什么?
class Complex
{
private:
float re;
float im;
public:
Complex(float r = 0.0, float i = 0.0) : re(r), im(i){}
Complex operator+(Complex c1);
};
Complex Complex::operator+(Complex c1)
{
return Complex(this->re + c1.re, this->im + c1.im);
}
int main()
{
Complex c1(1,2);
Complex c2(1,2);
Complex c3;
c3 = 1.0 + c2;
}
这是行不通的,是因为 1.0 不是一个复杂的对象,为什么这里没有初始化构造函数来创建一个 re=1.0, im =0.0 的对象?正如问题第一部分所假设的那样?
error: no match for 'operator+' in '1.0e+0 + c2'|
operator+
实现为成员函数时,运算符的 LHS 必须是 Complex
类型的对象。
当您将operator+
实现为非成员函数时,只要有一种方法可以使用隐式转换从中构造为 Complex
类型的对象,运算符的 LHS 就可以是任何内容。
这就是为什么非成员函数版本有效而成员函数版本无效的原因。
在第一种情况下,调用构造函数,因为
Complex(float r = 0.0, float i = 0.0) : re(r), im(i){}
当第二个参数未传递时,其工作原理类似于转换。因此,任何float
都可以转换为Complex
。
在第二种情况下,如果运算符是成员函数:
Complex Complex::operator+(Complex c1)
必须在类型 Complex
的对象上调用它。但是,当您编写:
c3 = 1.0 + c2;
float
的+
运算符将以 c2
作为参数进行调用("will",因为没有这样的运算符(。相反,如果您编写:
c3 = c2 + 1.0;
它应该有效,因为现在调用了c2
的+
运算符。它期望Complex
作为参数,1.0
可以转换,因此这将起作用。
感谢您的分享问题,
对于第一部分,我正在调试代码,发现对于点 c3 = 1.0 + c2;C++创建复杂对象(如预期的那样(,但带有参数(1.0 和 0(。如下所示,我粘贴在下面的调试信息。它类似于创建临时复杂变量,调用默认构造函数和参数作为 1.0 和 0 传递。又名复合体(1,0( 因此它工作正常。
断点 1,主 (( 在 probl.cpp:24
24 c3 = 1.0 + c2;
(GDB( S
Complex::Complex (this=0x23cc68, r=1, i=0( at probl.cpp:10
10 Complex(float r = 0.0, float i = 0.0( : re(r(, im(i({}
正如上面第二部分中其他人建议的那样,"+"运算符是复杂类的一部分,因此 c3 = 1.0 + c2; 如果 1.0 已转换为正确的复杂类实例,则仅调用 + 运算符。因此,它给出了编译错误。若要解决此问题,可以将代码更改为
c3 = 复数(1.0( + c2;
这里创建复杂类的临时对象,默认值为 re=1 和 im =0,然后对这个临时对象调用运算符 +。希望这有帮助。
- 我的简单if-else语句是如何无法访问的代码
- 当无法使用模板和宏时,生成类型变体C++代码的最简单方法是什么?
- 如何在没有函数的情况下编写此代码并使C++更简单?
- 一个非常简单的win32套接字代码,但工作错误
- boost::spirit--试图编译大多数简单代码的编译器错误
- 奇怪的 G++ 错误,带有关于左值和赋值的简单代码
- 运行简单的.oct文件时Octave崩溃,我的代码出了什么问题?
- 为什么 for 循环只接受这个简单代码中的最后一个字符串?
- 一个简单的 win32 多线程代码.这能行吗?
- 为什么括号在这个简单的代码中会有所不同
- 这段简单的代码有什么问题?
- 如何在C++编写简单的启动代码?
- 使用简单的 Indy 服务器代码进行访问冲突
- C++11 中的随机数:有没有一种简单的方法可以将生成器种子放在代码的一个位置,然后在不同的函数中使用它?
- C++ 使用简单的代码同时写入文件和控制台输出
- 程序告诉我初始化在编写简单的C ++代码时不需要初始化的变量
- 请解释为什么这个简单的C++(Qt)代码如此奇怪
- 需要帮助识别简单多线程代码中的错误
- 我写了这个简单的代码,应该计算一系列数组元素的最高数量,但结果很奇怪
- 代码简单