p668〜p684まで
フレンド
・特定のクラスのオブジェクトの生成をあるクラスに一手に任せたい場合には有用。
・ただし、本当に必要なときにのみ使うようにすること。
まぁ基本的には使わない方針ですね。デバッグ用クラスとか使うとしたらその辺りのみですね。
不完全型
これは要はクラスや構造体(型の方が適切かな)の前方宣言のこと。
・2つのクラスがお互いに参照しあう必要のある場合などに使う。
・実はフレンドクラスの指定もそれ自身が不完全型の宣言になっている。
・フレンドメンバ関数の場合は、他のクラスのメンバ関数を勝手に宣言することになってしまうので、プロトタイプ宣言は兼ねないようになっている。
using
・usingは別の名前空間内の識別子(あらゆる名前のこと)をusingを使用したスコープ内へと取り込むために使われるもの。
例)namespace Hoge { using namespace Fuga; } // こうするとFuga内の識別子はHoge名前空間内に取り込まれる if( bool ) { using namespace Hoge; do something... } // こうするとHoge内の識別子はif文のスコープへと取り込まれる // なんか違う気がする・・・。下の方が正しそう。 // Hoge内の識別子がグローバル名前空間に取り込まれて、 // if文内でHogeの指定なしでHoge内の識別子を使用可能になる。・usingを特定の識別子のみに使った場合がusing宣言になる。この場合はその識別子のみがそのスコープ内に取り込まれる。
・usingは実体定義に影響を与えない
・あるメンバ関数を派生クラスで宣言した場合、基底クラスにある同名のメンバ関数は全て使えなくなる。using宣言を利用することでこれを回避することが可能。なお、継承関係がない場合には以下の方法は使えない。
例)// 使えなくなる場合 class Hoge { public: void hoge(char ch) {} void hoge(int i) {} // このほかにもhogeをオーバーロードしたものがいっぱいあるとする }; class Hoge1 : public Hoge { public: void hoge(char ch) {} // hoge(char ch)以外が使えなくなりコンパイルエラー // もしコンパイルを通したければ全hogeをオーバーライドする必要がある }; // using宣言で回避した場合 class Hoge2 : public Hoge { public: void hoge(char ch) {} using Hoge::hoge; // これ1つで終わり }; // 逆に使えなくする方法 class Hoge3 : public Hoge { private: using Hoge::hoge; // Hoge3の外からHogeのメンバが見えなくなる。 };
usingが結構実りがあった気がする。public継承した場合、逆に外から使えないようにするためのprivateのusing宣言は結構いいなーとか思ったり。ただ、usingは馴染みがないのでちょっと難しかったですね。