[GeekBand][C++オブジェクト向け高度プログラミング]第1週学習ノート

4075 ワード

ヘッダファイル作成時の注意事項:
1.ヘッドファイルのレイアウト
#ifndef __xxxx__
#define __xxxx__

//     
//    
//    

#endif

2.同一機能が異なる場合の実現方式
関数リロードにより,主に構造関数と各種演算子リロードに現れる.
3.データは常にprivate領域に置かれる
4.定数メンバー関数にはconst制限子が必要
例:
    double real()   const   { return re; }

5.できるだけpass by reference
6.できるだけreturnby reference
7.友元関数の効率は呼び出し関数より高い
8.同じclassの各objectは互いに友元である
例:
class complex
{
public:
    complex(double r = 0, double i = 0)
        :re(r), im(i)
    {}

    double func(const complex& c)
    {
        return c.re + c.im;
    }
private:
    double re, im;
};
complex c1(2, 1);
complex c2;

c2.func(c1);

9.オペレータリロードできるだけクラス外に定義する
使用制限の防止
10パラメータリストに不変のパラメータにconstを付ける
付録:
以下は1週間目の勉強で書いたcomplexです.hヘッダファイル
#ifndef __MYCOMPLEX__
#define __MYCOMPLEX__
#include 

class ostream;
class complex;

inline double real(const complex&);
inline double imag(const complex&);
inline complex& __doapl(complex*, const complex&);
inline complex& __doami(complex*, const complex&);
inline complex& __doaml(complex*, const complex&);

class complex
{
public:
    complex(double r = 0, double i = 0)
        : re(r), im(i)
    {}
    complex& operator +=(const complex&);
    complex& operator -=(const complex&);
    complex& operator *=(const complex&);
    complex& operator /=(const complex&);
    double real()   const   { return re; }
    double imag()   const   { return im; }

private:
    double re, im;

    friend complex& __doapl(complex*, const complex&);
    friend complex& __doami(complex*, const complex&);
    friend complex& __doaml(complex*, const complex&);

    friend double real(const complex&);
    friend double imag(const complex&);
};

inline double real(const complex& c){ return c.re; }
inline double imag(const complex& c){ return c.im; }

inline complex& __doapl(complex* ths, const complex& r)
{
    ths->re += r.re;
    ths->im += r.im;
    return *ths;
}

inline complex& __doami(complex* ths, const complex& r)
{
    ths->re -= r.re;
    ths->im -= r.im;
    return *ths;
}

inline complex& __doaml(complex* ths, const complex& r)
{
    ths->re = ths->re * r.re - ths->im * r.im;
    ths->im = ths->re * r.im + ths->im * r.re;
    return *ths;
}

inline complex& complex::operator +=(const complex& r)
{
    return __doapl(this, r);
}

inline complex operator +(const complex& l, const complex& r)
{
    return complex(real(l) + real(r), imag(l) + imag(r));
}

inline complex operator +(const complex& l, const double& r)
{
    return complex(real(l) + r, imag(l));
}

inline complex operator +(const double& l, const complex& r)
{
    return complex(l + real(r), imag(r));
}

inline complex operator -(const complex& l, const complex& r)
{
    return complex(real(l) - real(r), imag(l) - imag(r));
}

inline complex operator -(const complex& l, const double& r)
{
    return complex(real(l) - r, imag(l));
}

inline complex operator -(const double& l, const complex& r)
{
    return complex(l - real(r), -imag(r));
}

inline complex operator *(const complex& l, const complex& r)
{
    return complex(real(l) * real(r) - imag(l) * imag(r), real(l) * imag(r) + imag(l) * real(r));
}

inline complex operator *(const complex& l, const double& r)
{
    return complex(real(l) * r, imag(l) * r);
}

inline complex operator *(const double& l, const complex& r)
{
    return complex(l*real(r), l*imag(r));
}

inline complex operator /(const complex& l, const double& r)
{
    return complex(real(l) / r, imag(l) / r);
}

inline complex operator +(const complex& c)
{
    return c;
}

inline complex operator -(const complex& c)
{
    return complex(-real(c), -imag(c));
}

inline std::ostream& operator <