参照とポインタの扱い




あるメソッドの引数として、構造体を受け渡しする方法は、一般に以下の3つが考えられます。

枠-1
1.値渡し
        void foo(RECT rc);
2a.ポインタ渡し
        void foo(RECT* rc);
3a.参照渡し
        void foo(RECT& rc);


値渡しは、コピーのオーバーヘッドがあるので、普通は使いません。
2.か3.かですが、これらは、呼び出し元で指定しているRECT構造体を破壊するかも知れません。破壊しないことがわかっている場合は、次のようにconstを書きます。

枠-2
2b.constポインタ渡し
        void foo(const RECT* rc);
3b.const参照渡し
        void foo(const RECT& rc);


yaneSDK3rdで主に使用しているのは、この2b.と3b.の方法です。2bと3bとの使いわけは、次のように考えています。

枠-3
NULLを渡し得る場合は、ポインタ渡し(2b.)を用いる。
アドレスがNULLである実体を絶対に渡さないことが、わかっているのならば、参照渡し(2c.)を用いる。


実際のところは、

枠-4
        LPRECT rc = NULL;
        foo(*rc);       //  foo(const RECT&)の呼び出し


というようにNULLである実体を渡すことは(言語構造上)出来ます。しかし、このような呼び出しは行なわないものとします。foo(const RECT&)の実装部において、以下のようなNULLチェックは行ないません。

枠-5
    void    foo(const RECT&rc){
        if (&rc == NULL) return; // NULLオブジェクトなので返る
    }


逆に、ポインタ渡しである場合は、その実装において、NULLチェックは必ず行なうものとします。