c++primerノート、第七章

3833 ワード

  • コンパイラは、クラスを2つのステップで処理します.まず、クラスがすべて表示されるまで、メンバーの宣言をコンパイルします.したがって、メンバーの関数体は、クラス内の他のメンバーを任意に使用することができ、これらのメンバーの出現回数
  • を気にする必要はありません.
  • constがメンバー関数のパラメータリストに書いた関数を定数メンバー関数と呼び、定数メンバー関数は呼び出されたオブジェクトの内容を変更しない.定数オブジェクト、および定数オブジェクトの参照またはポインタは、定数メンバー関数
  • のみを呼び出すことができます.
  • コンパイラによって作成されたコンストラクタは合成のデフォルトコンストラクタとも呼ばれ、合成されたコンストラクタは非常に簡単なクラスにのみ適用されます.ほとんどのクラスでは、この合成のデフォルトコンストラクタは、次のルールに従ってクラスのデータメンバーを初期化します.
  • クラス内の初期値が存在する場合、メンバー
  • を初期化するために使用する.
  • それ以外の場合、デフォルトではメンバー
  • が初期化されます.
  • 変数を初期化し、値でオブジェクトを渡したり戻したりすると、オブジェクトがコピーされます.割り当て演算子を使用すると、オブジェクトの割り当て操作
  • が発生します.
  • classとstructの唯一の違いは、デフォルトのアクセス権限が異なることです.structを使用する場合、最初のアクセス説明子(public,private,protected)を定義する前のメンバーはpublicで、classはprivateの
  • です.
  • 友元宣言はクラス定義の内部にしか現れず、具体的には制限されず、友元はクラスのメンバーではなく、その地域アクセス制御レベルの制約を受けず、一般的にはクラス定義の開始時または終了前に友元を集中的に宣言することが望ましい.友元宣言は、通常の意味での関数宣言
  • ではなく、アクセス権限のみを指定します.
  • クラスは、クラス内の別名のタイプをカスタマイズできます.タイプを定義するメンバーは、定義後に
  • を使用する必要があります.
  • 可変データメンバー:宣言時にmutableキーワードを追加し、constメンバー関数でこのデータメンバーを変更したい場合があります.可変データメンバーはconst
  • ではありません.
  • は、クラスの定義を最初に完了する必要があります.次に、コンパイラは、クラスがすべて完了した後にのみクラスが定義されるため、クラスのメンバータイプがクラス自体ではないことを知っています.しかし、クラスの名前が表示されると、クラスは自身のタイプへの参照またはポインタ
    class Link_screen{
        Screen window;
        Link_screen *next;
        Link_screen *prev;
    };
  • を含むことを許可するため、宣言された(定義されていない)とみなされる.
  • クラスが友元クラスを指定した場合、友元クラスのメンバー関数は非共有メンバーを含むすべてのメンバーにアクセスでき、1つのメンバー関数を友元と宣言する場合、そのメンバー関数がどのクラスに属しているかを明確に指摘する必要があります.クラスがリロード関数のセットをその友元に宣言したい場合は、この関数のセットのそれぞれを宣言する必要があります.友元関数はクラスの内部で定義することができ、クラスの内部で友元関数を定義しても、クラスの外部に
    struct X{
        friend void f() { std::cout << "             "  << std::endl;}
        //X() { f(); }    //   :f       
        void g();
        void h();
    };
    
    //void X::g() { return f(); }   //  :f       
    void f();
    void X::h() { return f(); }   //   
  • が表示されるように、対応する宣言を提供する必要があります.
  • constまたは参照タイプを初期化する唯一の機会は、コンストラクション関数の初期値(値を付与できない)
  • です.
  • メンバーの初期化順序は、コンストラクション関数の初期値リストの初期値の前後順序に関係なく、クラス定義での出現順序と一致する.メンバーの初期化順序
  • を考慮する必要がないように、一部のメンバーを使用して一部のメンバーを初期化することをできるだけ避けます.
  • 依頼コンストラクタ自分の一部(または全部)の職責を他のコンストラクタに委任し、依頼されたコンストラクタの初期値リストと関数体が順次実行され、その後、制御権が依頼者の関数体
  • に渡される.
  • コンパイラは自動的に1ステップタイプ変換のみを実行し、キーワードexplicitを使用してコンストラクタ定義の暗黙変換を阻止し、キーワードは1つの実パラメータのコンストラクタにのみ有効であり、複数の実パラメータを必要とするコンストラクタは暗黙変換を実行するために使用できないため、これらの関数をexplicitとして指定する必要はありません.explicitキーワードはクラス内の構造関数宣言にのみ表示されます.強制型変換
  • はexplicit構造関数を用いて明示的に行うことができる.
  • 集約クラス:
  • すべてのメンバーはpublicの
  • です.
  • 構造関数は定義されていません
  • クラス内の初期値がない
  • ベースクラスもvirtual関数も
  • もありません
    struct Data{
        int ival;
        string s;
    };
    クラスのデータメンバーを初期化するためにカッコで囲むメンバーの初期値リストを提供することができ、初期値リスト要素がクラスのデータメンバー数より少ない場合、後のメンバーは値で初期化16.静的データメンバーについて:(1)constとして宣言できない;(2)任意のオブジェクトにバインドされず、thisポインタは含まれません.(3)役割ドメイン演算子、クラスのオブジェクト、参照またはポインタを使用してアクセスできます.(4)クラスの外部で各静的メンバーを定義し、初期化する必要があり、1つの静的データメンバーは1回しか定義できない.(5)静的メンバーにはconst整数タイプのクラス内初期値を提供できますが、静的メンバーには式字面値定数タイプのconstexprが必要です.初期値は定数式でなければなりません(6)静的メンバーをデフォルトの実数として使用できます.