第7章クラス
7.1抽象データ型を定義する
1.抽象データ型
関数にのみアクセスでき、メンバー変数にアクセスできないクラスは、抽象データ型と呼ばれます
2、*これ
戻り値が* thisの場合、返されるのは、メソッドを呼び出したインスタンスの参照型(左辺値)です。
3.IOタイプのパラメータはコピーできません
IOタイプを関数パラメーターとして使用する場合、コピーの代わりに参照のみを使用できます。
4.デフォルトのコンストラクター
クラスがコンストラクターを宣言していない場合にのみ、コンパイラーはデフォルトのコンストラクターを生成します
5.コンストラクターの初期値のリスト
コンストラクターで、コロンとメンバー変数名に加えて、関数パラメーターの後の括弧の初期値を使用して、クラスのメンバー変数に初期値を割り当てます。
コンストラクターの目的はメンバー変数を初期化することであるため、コンストラクターで初期化されないメンバー変数は、デフォルトでコンストラクターの初期値リストを使用して初期化されます。
7.2アクセス制御とカプセル化
1.構造体とクラスの違い
構造体のデフォルトのアクセス許可はパブリックであり、クラスのデフォルトのアクセス許可はプライベートです
2.フレンド機能の宣言
一部の追加クラス関数が関数操作を完了するためにクラスインスタンス内のプライベートメンバー変数にアクセスする必要がある場合、これらの関数はフレンド関数として宣言する必要があります。
フレンド関数の宣言はアクセス権の宣言であり、関数の実際の宣言は外部で行う必要があります。
フレンド関数の宣言はクラス内で行う必要があります。クラスの宣言の前にfriendキーワードを追加します。フレンド
関数の宣言は、クラス定義の最後に配置することをお勧めします。このようにして、友達の関数とクラスを組み合わせることができます。
7.3クラスの他のプロパティ
1.クラスで定義されたメンバー関数は自動的にインライン化されます
関数定義は一般にクラス内で記述されるため、関数自体は単純で、インライン関数としての拡張に適しています。したがって、クラスで定義されたメンバー関数は、デフォルトでインラインとしてマークされます。
クラスの外部宣言にインラインタグを付けて、クラスのメンバー関数がインライン関数であることを示すこともできます。
単純な関数をインライン関数として宣言すると、効率が向上します
2.クラスのタイプ
コンパイルの原則に関する知識によれば、c ++は名前の同等性を採用する必要があります。クラスのメンバーが同じでも、クラスの名前が異なり、タイプも異なります
3.友達クラスの宣言
同様に、クラスが別のクラスのプライベートメンバー変数にアクセスする必要がある場合、アクセスクラスは、アクセスされているクラス内のフレンドクラスとして設定できます。
同様に、別のクラスのメンバー関数をフレンドとして設定して、フレンドとして宣言されたこのクラスのメンバー関数のみがクラスのプライベートメンバー変数にアクセスできるようにすることもできます。
4.オーバーロードされた関数と友達
オーバーロードされた関数には、複数のバージョンがあります。
クラスのバージョンごとに友達宣言が必要です
7.4クラスの範囲
1.各クラスは名前空間に相当します
ここで、ScreenIndexは、クラスのtypedefによって定義された新しい型であり、この型はクラス内のスペースでのみ有効です。
2.外側のスコープを見つける
クラス内のグローバル変数とメンバー変数の名前が同じである場合は、::スコープ演算子を使用して、必要な変数がクラス外のグローバル変数であることを示します(名前を重複させることはお勧めしません)。
7.5コンストラクターについて話す
1.「最初に定義してから割り当てる」と「定義して初期化する」を区別する
クラスのコンストラクターの場合、初期値リストで行われるのは** "define and initialize" **で
あり、コンストラクター内の等号を使用した割り当ての場合、 ** "define and thenassign" **です。
デフォルトのコンストラクターのない一部のconst定数またはクラスの場合。
「初期化」を使用している場合は問題ありません。
しかし、「コピー割り当て」を使用している場合は、問題があります。
そのため、コンストラクターの初期値リストが必要になる場合があります。
2.メンバーの初期化の順序
場合によっては、あるメンバーの初期化に別のメンバーの値が必要であり、現時点ではメンバーの初期化の順序が重要です。
一般的に、コンストラクターの初期値リストの初期化の順序は、クラスのメンバーが現れる順序に従って実行されます。初期値リストの出現順序によって決定されるわけではありません。
このとき、iを最初に初期化し、次にjを初期化する必要があります。ただし、iを最初に初期化すると、初期化されていないjが使用されるため、エラーが報告されます。
可能であれば、あるメンバーを使用して別のメンバーを初期化することは避けてください。初期化にコンストラクターパラメーターを使用する必要があります。
3.コンストラクターを委任します
コンストラクターの初期値リストで他のコンストラクターを呼び出します。これは、委任コンストラクターと呼ばれます。初期化操作を支援するために他のコンストラクターを委任します
。実行順序:委任側の初期値リスト、委任側の初期値リスト、委任側のコードブロック、委任側のコードブロック
4.デフォルトのコンストラクターを使用します
5.クラスの暗黙的な変換
クラスコンストラクターが単一の引数を取る場合、パラメーター型変換は暗黙的にクラス型になります。
Bは1つのパラメーターのみを受け入れ、パラメーターのタイプは文字列です
。ShowB関数はタイプBの変数を受け取り、変数のメンバー変数sを出力し
ます。ShowB関数を呼び出すときに、文字列タイプの変数を渡すことができます。「文字列型」から「B型」への暗黙の変換。
①この変換では、1ステップの型変換のみが可能
です。上の図の最初の関数呼び出しは、2段階の変換を実行します:
char *-> string
string-> Sales_date、
したがって、呼び出しは間違っています
②、クラス
③の対応するコンストラクターの前にexplicitを宣言することで変換を禁止できます。explicitとして宣言されたコンストラクターはコピー初期化を使用できません。
6.集約
メンバーへの直接アクセス
7.6クラスの静的メンバー
1.静的メンバーを宣言します
- メンバー宣言の前にキーワードstaticを追加すると、そのキーワードがクラスに関連付けられます。
- 静的メンバーは、パブリックまたはプライベートにすることができます。
- クラスの静的メンバーはオブジェクトの外部に存在し、オブジェクトには静的データメンバーに関連するデータは含まれていません。
- 静的メンバー関数はどのオブジェクトにもバインドされておらず、このポインターは含まれていません。
2.クラスの静的メンバー変数を使用します
①、スコープ演算子を使用して
②に直接アクセスし、インスタンス
③を介して直接アクセスし、クラス内の関数に直接アクセスします。
3.クラス外の静的メンバーを定義します
一般的に、クラスの静的メンバーはクラスの外部で初期化する必要があります。そして、それらのライフサイクルはプログラム全体のライフサイクルに存在します。
4.クラス外の静的メンバーを初期化します
通常、クラスの静的メンバー変数は、クラス内で初期化しないでください。ただし、一部のリテラルはクラスで初期化できます。
このとき、クラス外にステートメントを追加する必要がありますが、初期値は添付しないでください。