類のほんの少しの知識
4159 ワード
C++類の知識をまとめ、「C++primer」を参考に、温故知新~コンストラクション関数の初期化リスト: デフォルトのコンストラクション関数のないクラスタイプのメンバー、constまたは参照タイプのメンバーは、いずれのタイプでもコンストラクション関数の初期化リストで初期化する必要があります.
メンバーの初期化の順序は、メンバーを定義する順序であり、リストを初期化する順序ではありません.は指定inline関数を表示し、クラス定義体内でメンバーをinlineと指定したり、クラス定義体外の関数定義でinlineと指定したりすることができます.宣言と定義でinlineを指定するのは合法です. クラス定義体が完了した場合にのみクラスを定義できるため、クラスは独自のタイプのデータメンバーを持つことはできません.ただし、クラス名が表示されると、クラスが宣言されたとみなされます.したがって、クラスのデータ・メンバーは、独自のタイプへのポインタまたは参照であってもよい.
次のようになります.
thisポインタがいつ使用されるか:メンバー関数には、クラスオブジェクトを指す追加の隠しパラメータがあります.この隠しパラメータはthisと名付けられ、メンバー関数を呼び出すオブジェクトにバインドされます.
通常、メンバー関数の内部にthisを参照する必要はありませんが、次のようにする必要があります.
オブジェクトを参照オブジェクトのメンバーではなく全体的な参照として使用する必要がある場合、このような関数ではthisが使用されます.この関数は、関数を呼び出すオブジェクトへの参照を返します.次のようになります.
通常の非constメンバー関数では、thisのタイプはクラスタイプを指すconstポインタ(ポインタ定数)である.すなわち、thisが指す値を変更することができるが、thisが保存しているアドレスを変更することはできない.
constメンバー関数では、thisのタイプはconstクラスタイプオブジェクトを指すconstポインタです.thisが指すオブジェクトを変更することも、thisが保存しているアドレスを変更することもできません.
constオブジェクトはconstメンバーのみを使用できます.非constオブジェクトは任意のメンバーを使用できますが、非constバージョンはより良い一致です.可変データメンバー:mutable クラスのデータ・メンバー(constメンバー関数内でも)を変更したい場合があります.これはmutableとして宣言することで実現できます.
すなわち、可変データメンバーはconstではありません.暗黙型変換 単一の実パラメータで呼び出すことができる構造関数は、パラメータタイプからクラスタイプへの暗黙的な変換を定義します.
例:
ここでの各コンストラクション関数は、暗黙的な変換を定義します.だから、Sales_を楽しみにしています.itemタイプのオブジェクトの場所で、stringまたはistreamを使用できます.
コンストラクション関数によって定義される暗黙変換を抑制:コンストラクション関数をexplicitとして宣言することで、暗黙変換が必要なコンテキストでコンストラクション関数を使用することを防止できます.
友元メカニズム 友元(friend)メカニズムでは、クラスが指定した関数またはクラスに非公有メンバーのアクセス権を付与することができます. staticクラスメンバー 特定のクラスタイプのオブジェクト全体に対して、グローバルオブジェクトにアクセスする必要がある場合があります.プログラムの任意の点で作成した特定のクラスタイプのオブジェクトの数を統計する必要があるかもしれません.あるいは、グローバルオブジェクトは、クラスのエラー処理ルーチンを指すポインタである可能性があります.または、クラスタイプオブジェクトのメモリフリーストレージ領域を指すポインタです.
グローバルオブジェクトはカプセル化を破壊し、クラスはクラスの静的メンバーを定義できます.
staticデータメンバーは、クラスの任意のオブジェクトとは独立して存在する.各staticデータメンバーは、クラスに関連付けられたオブジェクトであり、クラスのオブジェクトに関連付けられていません.
staticメンバー関数にはthisポインタがなく、所属するクラスのstaticメンバーに直接アクセスできますが、非staticメンバーを直接使用することはできません.
staticメンバー関数は虚関数として宣言できません.
メンバーの初期化の順序は、メンバーを定義する順序であり、リストを初期化する順序ではありません.
次のようになります.
class LinkScreeen{
Screen window;
LinkScreen *next;
LinkScreen *prev;
}
通常、メンバー関数の内部にthisを参照する必要はありませんが、次のようにする必要があります.
オブジェクトを参照オブジェクトのメンバーではなく全体的な参照として使用する必要がある場合、このような関数ではthisが使用されます.この関数は、関数を呼び出すオブジェクトへの参照を返します.次のようになります.
Screen& Screen::move(index x, index c)
{
index row = r *width;
cursor = row+c;
return *this;
}
constメンバー関数では、thisのタイプはconstクラスタイプオブジェクトを指すconstポインタです.thisが指すオブジェクトを変更することも、thisが保存しているアドレスを変更することもできません.
constオブジェクトはconstメンバーのみを使用できます.非constオブジェクトは任意のメンバーを使用できますが、非constバージョンはより良い一致です.
すなわち、可変データメンバーはconstではありません.
例:
class Sales_item{
public:
Sales_item(const std::string &book = “ ”):
isbn(book), units_sold(0), revenus(0.0){ }
Sales_item(std::istream &is);
};
ここでの各コンストラクション関数は、暗黙的な変換を定義します.だから、Sales_を楽しみにしています.itemタイプのオブジェクトの場所で、stringまたはistreamを使用できます.
コンストラクション関数によって定義される暗黙変換を抑制:コンストラクション関数をexplicitとして宣言することで、暗黙変換が必要なコンテキストでコンストラクション関数を使用することを防止できます.
class Sales_item{
public:
explicit Sales_item(const std::string &book = “ ”):
isbn(book), units_sold(0), revenus(0.0){ }
explicit Sales_item(std::istream &is);
};
グローバルオブジェクトはカプセル化を破壊し、クラスはクラスの静的メンバーを定義できます.
staticデータメンバーは、クラスの任意のオブジェクトとは独立して存在する.各staticデータメンバーは、クラスに関連付けられたオブジェクトであり、クラスのオブジェクトに関連付けられていません.
staticメンバー関数にはthisポインタがなく、所属するクラスのstaticメンバーに直接アクセスできますが、非staticメンバーを直接使用することはできません.
staticメンバー関数は虚関数として宣言できません.