c++クラス

6929 ワード

1:メンバー関数の宣言はクラスの内部にある必要がありますが、その定義はクラスの内部にもクラスの外部にもあります.2:thisメンバー関数は、thisというポインタという追加の暗黙的なパラメータによって呼び出されたオブジェクトにアクセスします.たとえば、メンバー関数が呼び出されると、その関数を要求するオブジェクトアドレスでthisが初期化され、例えばf.func()が呼び出されると、コンパイラはf func を担当する.funcにはもともとパラメータはありませんが、現在はfunc(&f)に相当します.3:定数メンバー関数:
std::string Sales_data::isbn() const 
{ return bookNo; }
       
std::string Sales_data::isbn(const Sales_data *const this)
{ return this->isbn; }

このは定数を指すポインタであるため、メンバー関数は呼び出されたオブジェクトの内容を変更できません.isbnは、オブジェクトのデータメンバーを読み込むことができますが、新しい値を書き込むことはできません.
4:メンバー関数体は、クラスに定義されたメンバーを任意に使用して、メンバーが現れる順序を気にする必要はありません.5:クラスの外部でメンバー関数を定義する
  • パラメータで、関数名と戻り値タイプはクラスの定義と一致しなければなりません.
  • 定数メンバー関数の場合、その定義もパラメータリストの後にconst属性を明確に指定する必要があります.
  • このメンバー関数が変数名を使用してクラスで定義された変数と一致する場合、デフォルトではクラスの変数が使用されます.

  • 6:クラス関連の非メンバー関数の注意点:メンバーを変更する必要がある場合は、パラメータタイプを通常の参照として定義し、変更しない場合はconstの参照として定義します.
    7:コンストラクション関数デフォルトコンストラクション関数:コンパイラによって生成され、クラス内の初期値の数値を使用して初期化されます.コンストラクション関数の初期値リスト:{}の間にある部分.コンストラクション関数は一般的にクラスの内部に配置されます.
    8:動的なメモリ割り当てが必要な場合、vectorまたはstringのクラスを使用すると、メモリの割り当てと解放による複雑さを回避できます.
    9:アクセス・ディスクリプタ:1つのc++クラスに0つ以上のアクセス・シンボルを持つことができます.また、あるアクセス記号が何回現れるかについては制限はありません.1つのアクセス記号の制限の範囲は、1つのアクセス記号から次のアクセス記号に遭遇するか、クラス全体が終了するかを規定します.public:説明子の後のメンバーは、プログラム全体にアクセスできます.private:説明子の後のメンバーは、クラスのメンバー関数によってアクセスできますが、クラスのコードを使用してアクセスできません.すなわち、詳細が隠されています.
    10:structとclassの唯一の違い:デフォルト権限の違い
    クラスの最初のアクセス説明子の前にクラスのメンバーを定義できます.structの場合、デフォルトのアクセス権はpublicで、classの場合、デフォルトのアクセス権はprivateです.
    11:クラスのメンバー関数のデフォルトはインラインですが、クラスの外部でinlineキーワードで関数の定義を修飾することもできます.12:メンバー関数の再ロード:メンバー関数は非メンバー関数と同様に再ロードできます.パラメータの一致に基づいて行います.
    13:mutable
    constのオブジェクトのメンバーであっても、メンバー変数を変更する必要がある場合があります.たとえば
    class Screen{
    public:
        void some_member() const;
    private:
        mutable size_t access_ctr;
    };
    
    void Screen::some_member() const
    {
        ++access_ctr;  //         const ,  access_ctr     。     mutable               const。
    }

    14:constのメンバー関数*thisを参照として返すと、その戻り値タイプは定数参照になります.
    15.クラスは1つのタイプで、あるクラス(A)で別のクラス(B)を使用する必要がある場合があります.これは、このクラス(B)を(A)の前に宣言する必要があります.クラスの宣言はclass B;です.
    16:Friend、Friendクラス、Friend関数:
    友元: でプライベートデータドメインにアクセスできます.友元関数の場合、クラスの外部で宣言する必要があります.一般的な位置はクラスの開始前に集中します.
    FriendクラスとFriend関数:
    class Screen {
        friend class Window_mgr; //window_mgr        Screen      。
        //                 ,                  。
        friend void Window_mgr::clean(index); //clean()       Screen      .
    };

    1つのクラスに友元クラスが含まれている場合、他のクラスに友元が含まれているため、他の2つのクラスも友元であることを説明することはできません.すなわち、各クラスは自分の友元クラスまたは友元関数を担当することを指します.
    17:依頼コンストラクション関数注意すべきは,依頼コンストラクション関数が依頼された部分,すなわち最も長いコンストラクション関数を先に実行することである.コンストラクション関数に関数体がある場合、プログラムは関数体を順次実行して完了します.
    18:暗黙的なクラスタイプの変換
    1つの実パラメータのみを受け入れるコンストラクション関数では、コンストラクション関数のパラメータタイプからクラスタイプへの暗黙的な変換のルールを定義できます.
    class Sales_data {
    public:
        Sales_data(const std::string &s,unsigned p,double d):bookNo(s),units_sold(p),revenue(d*p) { }
        Sales_data(const std::string &str):Sales_data(str,0,0) { }
    private:
        std::string bookNo;
        unsigned units_sold = 0;
        double revenue = 0.0;
    };
    int main(int argc,char *argv[])
    {
        std::string null_book = "9-99-999-9999";
        item.combine(null_book); //       string    bookno "9-99-999-9999",units_sold 0,revenue 0 Sales_data。
    //                   。
    }
    explicitを用いて構造関数のこのような暗黙的な変換を抑制することができるのは、構造関数の前にexplicitを宣言することであり、1つの実パラメータの構造関数にのみ効果があり、クラス内で宣言するときにのみ使用でき、外部で定義するときに繰り返すべきではない.explicitを使用した後、直接初期化しか使用できません.
    19:集約クラス-すべてのメンバーがpublic-コンストラクション関数が定義されていません-クラス内の初期値がありません-ベースクラスがなく、virtual関数がありません
    20:フォント定数クラス:データメンバーはすべてフォント値タイプの集約クラスである-データメンバーはすべてフォント値定数である必要がある-クラスは少なくとも1つのconstexpr構造関数を含む必要がある
    22:static
  • static修飾子は、クラスの静的メンバーが任意のオブジェクトの外に存在する変数を共有する多くのクラスを保証することができる.
  • オブジェクトには、静的データメンバーに関連するデータは含まれていません.
  • 静的データ・メンバーは、thisポインタを含まない任意のオブジェクトにバインドされません.
  • はクラス内の宣言にのみ表示されます.
  • 定数静的データメンバーがクラス内部で初期化されても、通常はクラスの外部で定義されるべきである.
  • class Account {
    public:
        void calculate() {amount += amount * interestRate;}
        static double rate() { return interestRate;} //   ,        
        static void rate(double); 
    private:
        std::string owner;
        double amount;
        static double interestRate;
    };