C++primerクラスメンバー変数メンバー関数友元


C++Primerの第12章を見て、簡単にまとめます.
クラスの思想:データの抽象とパッケージ.
データパッケージ:提供されるインタフェースとインタフェースの実装が分離されていることを意味します.つまり、インタフェースを使用する場合、詳細に関心を持つ必要がなく、インタフェースの機能を知る必要があります.
カプセル化:クラスは明らかにいくつかのデータメンバーをカプセル化し、次に、関数もカプセル化され、一連の操作をカプセル化します.
次に、クラスのメンバーの書き込みを開始します.
この章のクラスは、キーワードstructまたはclassで定義されています.
クラスは定義が完了してからオブジェクトを定義できますが、クラスではクラスのポインタと参照を定義できます.
注意:クラスの宣言と定義の間では、クラスのオブジェクトを定義できません.
クラスによってオブジェクトが定義されると、作成されたオブジェクトにスペースが割り当てられます.各オブジェクト間は互いに独立しており、それぞれ独自のデータがセットされている(staticを除く).
データ・メンバーのタイプ:
アクセス制御メカニズムによりprivate,public,protectedがある.
データそのものの性質(一応)から、staticと非staticがある.簡単に言えば、staticメンバーはクラス独自のもので、対象に分けられない.
注意:staticメンバーはクラス独自であるため、単一のオブジェクトには所有されないため、thisポインタを使用してアクセスできません.
それなら、staticメンバー関数という特殊なstatic変数を操作するために関数を定義する必要があります.
オブジェクトを定義する前に初期化できないconst staticメンバーですが、const staticメンバーはクラスの定義に直接書くことができます.
例:
class MyClass{
private:
 static const int _size = 7;
 int number[_size];
 //...
public:
 //other member

};

この変数はクラスで初期値が設定されているため、つまりクラスでは対_sizeの宣言は、定義ではないので、クラス定義のほかに定義する必要がありますが、初期値を指定する必要はありません.このように:
const int MyClass::_size;

さらに、staticメンバーは、クラスの定義でstaticメンバー変数がクラスのオブジェクトであることができるため、「宣言後に定義する」という説(自分では記憶しやすいように)を破った.例:
class MyClass{
public:
//...
private:
 static MyClass my1;
 MyClass my2; // error
};

前の例ではmy 2の定義は間違っており、クラスが定義されていない前にクラスの非静的オブジェクトを定義することはできません.
最後に、staticはクラス自体であるため、クラスのstatic変数はクラスのメンバー関数の実パラメータ値とすることができる.
要するにstaticメンバー変数はクラス独自であり,一意である.各オブジェクトはクラスでのみ操作できます.
次はメンバー関数です.
まず、クラスのメンバー関数には、関数を呼び出すオブジェクトがthisポインタで表される暗黙のパラメータがあります.一般的に、メンバー関数でメンバー変数を使用する場合はthisポインタを明示的に使用する必要はありませんが、オブジェクト自体の参照やポインタを返す必要がある場合は、形パラメータthisを忘れないでください.
メンバー関数にはconstと非constの区別もあり、constオブジェクトはconstメンバーのみ、非constメンバーはすべて使用できます.もちろん、関数マッチングの原則に基づいて、非constを優先的に使用します.
ここでは私の疑問をよく説明しているようです.
すなわち、パラメータがconstであるかどうかはリロード関数として使用できませんが、関数のパラメータが参照またはポインタである場合は
の場合、パラメータがconstであるかどうかが関数のリロードを実現できるかどうかは、そのオブジェクトのconstまたは非constを呼び出すことで、thisポインタにconstと非constの区別があるため、リロードできます.
mutableは不思議な言葉です.メンバー変数がmutableと宣言されると、どのようなオブジェクトであっても(constの有無)、その変数はいつでもどこでも変更できます.
どこでも!constメンバー関数でもそうであることを意味します.
次に、クラスの最も重要な関数です.コンストラクション関数です.
オブジェクトを定義するには、コンストラクション関数が必要です.コンストラクション関数を明示的に定義しない場合、コンパイラはデフォルトのコンストラクション関数を自動的に生成します.
しかし,ユーザがコンストラクション関数を定義すると,コンパイラはコンストラクション関数を管理しなくなる.
コンストラクション関数といえば、パラメータ初期化リストは重要な話題で、リストの名前はとても良くて、初期化!!ここでは付与ではなく初期化です.
特筆すべきは、コンストラクション関数に入る前にすべての変数が自分で初期化されます(初期化ルールを参照)が、データメンバーにデフォルトのコンストラクション関数がない場合やconstメンバー、参照メンバーがない場合は、初期化リストを使用する必要があります.彼らにとって、初期化リストは唯一の機会です!!
注意:メンバーの初期化順序は、初期化リストの順序に関係なく定義された順序と一致します.
友元:クラス、関数、その他のクラスのメンバー関数を友元として宣言できます.この友元関数は、クラスのメンバー変数にアクセスできます.
最後に、クラスの役割ドメインについて説明します.
クラスの役割ドメインは、メンバー関数自体(メンバー関数の場合)、クラス定義体内、クラスを定義する文ブロック、グローバルの3つの階層に分けて理解できます.
上記の手順でクラスのメンバーで使用される名前を解析し,前のレイヤで見つかったら次のレイヤには入らない.