ぼんさい塾

ぼんさいノートと補遺に関する素材や注釈です.ミスが多いので初稿から1週間を経た重要な修正のみ最終更新日を残しています.

Cから見たC++ (4)

2010-10-13 21:01:49 | 暮らし
記事一覧(Cの文法(1)~(17),他)
まず覚えるCの文法(progC.pdf)

P3.h: 複素数のクラス
//-------------------------------------
#include <stdio.h>
class complex{
private:
  double re, im;
public:
  complex(double x){re=x; im=0;}
  complex(double, double);
  void show(void);
  void load(complex);
  complex add(complex);
  complex mult(complex);
  void operator=(complex);
  complex operator+(complex);
  complex operator*(complex);
};
complex::complex(double x, double y){
  re=x; im=y;
}
void complex::show(void){
  printf("re=%f, im=%f\n", re, im);
}
void complex::load(complex z){
  re=z.re; im=z.im;
}
complex complex::add(complex z){
  return complex(re+z.re, im+z.im);
}
complex complex::mult(complex z){
  return complex(re*z.re-im*z.im,
                 re*z.im+im*z.re);
}
void complex::operator=(complex z){
  load(z);
}
complex complex::operator+(complex z){
  return add(z);
}
complex complex::operator*(complex z){
  return mult(z);
}
//-------------------------------------

=================================================
3. 多重定義

C++ では引数の数や型が異なれば異なる関数に同じ名
前を使う(多重に定義する)ことができます[3-1].さ
らに 予約語の operator を使って,演算子の記号も多
重定義できるのです[3-2].P3.h では コンストラクタ
complex() を多重定義し,演算子「=」「+」「*」の意
味も複素数の演算用に定義しなおしています.

・文法の理解が目的なので,減算・除算は省略します.
・加算,乗算は処理中の複素数と引数の複素数の演算で
  す.一般に処理中のオブジェクトはポインタ this で
  参照でき,「re+z.re」は「this->re+z.re」を意味し
  ています.
・C++ では struct もクラスのように使えます[3-3].

P3.cpp: 使用例
//-------------------------------------
#include "P3.h"
int main(void){
  complex z1(1, 2), z2(3, -4), z(0);
  z.load(z1.add(z2)); z.show();
  z.load(z1.mult(z2)); z.show();
  z=z1+z2; z.show();
  z=z1*z2; z.show();
  return 0;
}
//-------------------------------------

P3.cpp の「z.load(z1.add(z2));」は「z=z1+z2;」と
同じです.後者の方がずいぶん見やすいですね.

・演算子の優先順位は本来のものと同じです.このこ
  とを「z=z1*z1+z2*z2;」で確かめてください.
    z.re==-10 //(1-4)+(9-16)
    z.im==-20 //(2+2)+(-12-12)
  になっているはずです.

[3-1] オーバーロードとオーバーライド
[3-2] オペレータ(演算子)のオーバーロード
[3-3] C++構造体