アフィリエイト広告を利用しています

広告

posted by fanblog

2017年11月02日

《その102》 複素数クラス と 演算子の多重定義


複素数クラス C ( 複素数 a + bi の実部 a と虚部 b は整数とする )を用いて、いろいろな演算子関数をまとめてみました。

これまでに学んできた次のような点にも注意しながら、プログラムを作成しました。

 ・変換コンストラクタの必要性。
 ・演算子関数の返却値を C にするか C& にするかの判断。
 ・演算子関数の仮引数を const C& にする理由。
 ・演算子関数をクラスのメンバ関数として定義する場合と、非メンバ関数として定義する場合の相違点。


------------------------------------
// Complex.h
#ifndef ___Class_Abc
#define ___Class_Abc

#include <iomanip>
#include <iostream>

class C {
int a_;
int b_;
public:
// コンストラクタ(変換コンストラクタ兼用)
C(int a = 0, int b = 0) : a_(a), b_(b) { }

// ゲッタ
int a() const { return a_; }
int b() const { return b_; }

// 単項+演算子
C operator+() const { return *this; }

// 単項-演算子
C operator-() const { return C(-a_, -b_); }

// 2項+演算子(クラス内で定義したフレンド関数)
friend C operator+(const C& x, const C& y) {
return C(x.a_ + y.a_, x.b_ + y.b_);
}

// 2項-演算子(クラス内で定義したフレンド関数)
friend C operator-(const C& x, const C& y) {
return C(x.a_ - y.a_, x.b_ - y.b_);
}

// 複号代入+=演算子
C& operator+=(const C x) {
a_ += x.a_; b_ += x.b_;
return *this;
}

// 複号代入-=演算子
C& operator-=(const C x) {
a_ -= x.a_; b_ -= x.b_;
return *this;
}

// 等価==演算子(クラス内で定義したフレンド関数)
friend bool operator==(const C& x, const C& y) {
return x.a_ == y.a_ && x.b_ == y.b_;
}

// 等価!=演算子(クラス内で定義したフレンド関数)
friend bool operator!=(const C& x, const C& y) {
return !(x == y);
}

};
/* ← メンバ関数との二重定義を避けるためのコメントアウト
// 2項+演算子(クラスの外部で定義した場合)
inline C operator+(const C& x, const C& y) {
return C(x.a() + y.a(), x.b() + y.b());
}

// 2項-演算子(クラスの外部で定義した場合)
inline C operator-(const C& x, const C& y) {
return C(x.a() - y.a(), x.b() - y.b());
}

// 等価==演算子(クラスの外部で定義した場合)
inline bool operator==(const C& x, const C& y) {
return x.a() == y.a() && x.b() == y.b();
}

// 等価!=演算子(クラスの外部で定義した場合)
inline bool operator!=(const C& x, const C& y) {
return !(x == y);
}
*/ ← コメントアウト ここまで
inline std::ostream& operator<<(std::ostream& s, const C& x) {
return s << "a … " << std::setw(2) << x.a() << ", b … " << std::setw(2) << x.b();
}

#endif
------------------------------------

------------------------------------
// ComplexTest
#include <iostream>
#include "Complex.h"
using namespace std;

int main() {
C c1;
C c2(10, 20);
C c3(1, 2);

cout << "\n【 複素数 a + bi 】\n";
cout << "c1 : " << c1 << '\n';
cout << "c2 : " << c2 << '\n';
cout << "c3 : " << c3 << '\n';
cout << "\n単項+演算子, 単項-演算子\n";
cout << "+c3 : " << +c3 << '\n';
cout << "-c3 : " << -c3 << '\n';

cout << "\n2項+演算子, 2項-演算子\n";
cout << "c2 + c3 : " << c2 + c3 << '\n';
cout << "c2 - c3 : " << c2 - c3 << '\n';
cout << "c2 + 10 : " << c2 + 10 << '\n';
cout << "c2 - 10 : " << c2 - 10 << '\n';
cout << " 1 + c3 : " << 1 + c3 << '\n';
cout << " 3 - c3 : " << 3 - c3 << '\n';

cout << "\n複号代入+=演算子, 複号代入-=演算子\n";
cout << "c2 += c3 : " << (c2 += c3) << '\n';
cout << "c2 += 10 : " << (c2 += 10) << '\n';
cout << "c2 -= c3 : " << (c2 -= c3) << '\n';
cout << "c2 -= 10 : " << (c2 -= 10) << '\n';

cout << "\n等価==演算子, 等価!=演算子\n";
cout << boolalpha
<< "c2 == c3 : " << (c2 == c3) << '\n';
cout << "c2 != c3 : " << (c2 != c3) << '\n';
cout << "c1 == 0 : " << (c1 == 0) << '\n';
}
------------------------------------

c12_006.png



新版 明解C 入門編 (明解シリーズ)

新品価格
¥2,916から
(2017/8/30 21:02時点)









--
この記事へのコメント
コメントを書く

お名前:

メールアドレス:


ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバックURL
https://fanblogs.jp/tb/6923734
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック

 たまに、クリック お願いします m(_ _)m

 AA にほんブログ村 IT技術ブログ C/C++へ

こうすけ:メール kousuke_cpp@outlook.jp

【1】★★C++ 記事目次★★ ← 利用可能です。
・新版明解C++入門編 / 新版明解C++中級編
・その他 C++ 関連記事

【2】★★こうすけ@C#★★
・C# の初歩的な記事


検索
<< 2018年08月 >>
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
プロフィール
こうすけさんの画像
こうすけ

 たまに、クリック お願いします m(_ _)m

 AA にほんブログ村 IT技術ブログ C/C++へ

こうすけ:メール kousuke_cpp@outlook.jp

【1】★★C++ 記事目次★★ ← 利用可能です。
・新版明解C++入門編 / 新版明解C++中級編
・その他 C++ 関連記事

【2】★★こうすけ@C#★★
・C# の初歩的な記事


×

この広告は30日以上新しい記事の更新がないブログに表示されております。