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';
}
------------------------------------
--
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/6923734
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック