C++——友元関数と友元類学習

1640 ワード

参照リンク:
http://c.biancheng.net/view/169.html
https://www.cnblogs.com/staring-hxs/p/3432161.html
c++の友元はこの不透明な壁を隠すために小さな穴を開け、外部はこの小さな穴を通じて内部の秘密を垣間見ることができる.
友元の正確な使用はプログラムの運行効率を高めることができるが、同時にクラスのパッケージ性とデータの隠蔽性を破壊し、プログラムのメンテナンス性が悪くなる.
ゆうげんかんすう
友元関数はクラスの定義で宣言する必要があります.宣言時に友元の名前の前にキーワードfriendを付けるだけで、そのフォーマットは以下の通りです.
friendタイプ関数名(形式パラメータ);
注意事項:
  • ユーティリティー関数は、クラスのプライベートメンバーに直接アクセスできる非メンバー関数です.クラス外で定義された一般的な関数です.クラス
  • には属しません.
  • 友元関数の宣言は、クラスのプライベート部分に置くこともできるし、共通部分に置くこともできる.これらは区別されず、クラスの友元関数
  • であることを示している.
  • 1つの関数は、複数のクラスの友元関数であってもよく、各クラスで
  • をそれぞれ宣言する必要があるだけである.
  • 友元関数の呼び出しは、一般関数の呼び出し方式と原理と一致する.

  • 友元類
    1つのクラスAは別のクラスBを自分の友元として宣言することができ、クラスBのすべてのメンバー関数はクラスAオブジェクトのプライベートメンバーにアクセスすることができる.
    class CCar
    {
    private:
        int price;
        friend class CDriver;  //   CDriver     
    };
    class CDriver
    {
    public:
        CCar myCar;
        void ModifyCar()  //    
        {
            myCar.price += 1000;  // CDriver CCar    ,            
        }
    };
    int main()
    {
        return 0;
    }

    5行目はCDriverをCCarの友元クラスとして宣言する.この文はもともとCDriverがクラスであることを宣言しているので、CCarクラス定義の前にCDriverクラスを宣言する必要はありません.第5に行使されるCDriverクラスのすべてのメンバ関数は、CCarオブジェクトのプライベートメンバにアクセスすることができる.5行目がない場合、13行目のmyCarプライベートメンバーpriceへのアクセスによりコンパイルエラーが発生します.一般に、クラスAはクラスBを友元クラスと宣言するが、クラスBは論理的にクラスAと比較的近い関係にあることが望ましい.例えば上の例では、CDriverは運転手、CCarは車、運転手は車を持っているので、CDriver類とCCar類は論理的に密接に関係しており、CDriver類をCCar類の友元と宣言するのが合理的である.注意事項:
    (1)友元関係は継承できない.
    (2)友元関係は一方向であり,交換性を持たない.クラスBがクラスAの友元であれば、クラスAは必ずしもクラスBの友元ではなく、クラスに相応の声明があるかどうかを見なければならない.
    (3)友元関係に伝達性がない.クラスBがクラスAの友元であれば、クラスCはBの友元であり、クラスCは必ずしもクラスAの友元ではない.同じようにクラスに相応の申明があるかどうかを見なければならない.