C++複数クラス対除算演算子/のリロード

8763 ワード

C 8-1複素加減乗除
(100.0/100.0 points)
タイトルの説明
2つの複素数の加減乗除を求めます.
 
説明の入力
最初の行の2つのdoubleタイプ数は、最初の複素数の実部虚部を表します.
2行目の2つのdoubleタイプ数は、2番目の複素数の実部虚部を表す
出力の説明
出力2つの複素数の加算減算を順次計算し、1行1結果
出力複素数は実部、スペース、そして虚部を出力し、
サンプル入力
1 1

3 -1

サンプル出力
4 0

-2 2

4 2

0.2 0.4




 1 #include <cstdio>

 2 #include <cstring>

 3 #include <iostream>

 4 #include <algorithm>

 5 

 6 using namespace std;

 7 

 8 class Complex{

 9 public:

10     Complex(double r = 0.0, double i = 0.0) : real(r), imag(i) {};

11     Complex operator+ (const Complex &c2) const;

12     Complex operator- (const Complex &c2) const;

13 

14     /*        */

15     Complex operator* (const Complex &c2) const;

16     Complex operator/ (const Complex &c2) const;

17     friend ostream & operator<< (ostream &out, const Complex &c);

18 

19 private:

20     double real;

21     double imag;

22 };

23 

24 Complex Complex::operator+ (const Complex &c2) const {

25     return Complex(real + c2.real, imag + c2.imag);

26 }

27 

28 Complex Complex::operator- (const Complex &c2) const {

29     return Complex(real - c2.real, imag - c2.imag);

30 }

31 

32 Complex Complex::operator* (const Complex &c2) const

33 {

34     return Complex(real*c2.real - imag*c2.imag, real*c2.imag + imag*c2.real);

35 }

36 

37 Complex Complex::operator/ (const Complex &c2) const

38 {

39     if (c2.imag == 0)

40         return Complex(real / c2.real, imag / c2.real);

41     else

42         return (*this)*Complex(c2.real, -c2.imag) / Complex(c2.real*c2.real + c2.imag*c2.imag, 0);

43 }

44 

45 ostream & operator<< (ostream &out, const Complex &c)

46 {

47     out << c.real << " " << c.imag << endl;

48     return out;

49 }

50 

51 int main() {

52     double real, imag;

53     cin >> real >> imag;

54     Complex c1(real, imag);

55     cin >> real >> imag;

56     Complex c2(real, imag);

57     cout << c1 + c2;

58     cout << c1 - c2;

59     cout << c1 * c2;

60     cout << c1 / c2;

61 }

C++対オペレータのリロードです.
2つの点に注意してください.
1、<<の重荷についてはoutに戻ることに注意し、<<のカスケード出力(複数並列時)を実現することができる.
2、対/の重荷中、return(*this)*Complex(c 2.real,-c 2.imag)/Complex(c 2.real*c 2.real+c 2.imag*c 2.imag,0);このリロード関数自体を呼び出し続けます!それ自体が/に対する重荷で、あなたはここでまた/を使ったので、再帰します!return Complex(real/c 2.real,imag/c 2.real)を追加する必要があります.再帰を平凡な状況に帰す(実際には1層しか再帰しない).