Boolan c++メモ_5

2228 ワード

前言:
今回説明する主な内容は、オブジェクトモデルに関するいくつかの知識、const、operator new、operator deleteという一連の関数の再ロードです.
1.オブジェクトモデル
1.1ダミーポインタ、ダミーテーブル、ダイナミックバインド、マルチステート
クラスに虚関数がある場合、インスタンス化された各オブジェクトには虚表を指すポインタがあり、各オブジェクトにはそれぞれの虚表があり、虚表には虚関数のアドレスが格納され、各オブジェクトには虚関数が1部しかなく、各オブジェクトは虚表を調べて虚関数を見つけます.虚メカニズム動的バインドには3つの必要条件がある:ポインタ、1つのポインタがup-castに転換し、虚関数を呼び出す.ベースクラスポインタは各派生クラス,すなわち種々の形態を指すことができるので,多態と呼ぶ.(同じ虚関数を含むクラスで、異なるオブジェクトのvptrは異なり、それぞれのvtabがあるが、vtabで同じ虚関数を指すアドレスは同じである.なぜそれぞれvtabがあり、vtabが1つだけではないのか.)
1.2 thisについて
これはオブジェクト自身へのポインタです.クラス内のすべてのメンバー関数には、非表示のthis pointerがあります.Template Method:親クラスには布団クラスと外部で使用できる共通関数が書かれており、その内部には虚関数があります.使用すると、ユーザーは親を継承してサブクラスを作成し、虚関数を書き換え、この共通関数をサブクラスで呼び出すことができます.(*(this->vptr)[n])(this);
1.3動的バインド
2. const
  • 定数オブジェクトと非正規オブジェクトは、定数メンバー関数を呼び出すことができます.通常のオブジェクトでは、非常に多くのメンバー関数を呼び出すことはできません.データ・メンバーの関数を変更せずにconstを追加しない場合、constオブジェクトがこの関数を呼び出すとコンパイルがエラーになります.したがって、データ・メンバーを変更しないメンバー関数にはconstを追加する必要があります.
  • 常対象はcopy on writeを考慮する必要はなく、非常量はcopy on write eを考慮する必要がある.
  • 原則:constとnon-constメンバー関数が同時に存在する場合、通常のオブジェクトはconstメンバー関数のみを呼び出すことができ、非常にオブジェクトはnon-constメンバー関数のみを呼び出すことができる.

  • 3.newとdelete
    newの4つの形式:new式、operator new、array new、placement new.
  • operator new,operator delete,operator new[],operator delete[]を再ロードします.メモリプールを作るために、彼らの重荷を引き継ぐことを目的としています.動的に割り当てられた配列割り当てのメモリの前にcounterがあります(4バイトを占め、配列内の要素の数を格納します).呼び出したグローバルを表すnewとdelete.自分でclassで定義したのではありません.グローバルなリロードも可能です.
  • placement new,placement delete class member operator new()をリロードします.class member operator delete()には複数のバージョンがあります.各バージョンには独自のパラメータ列が必要です.最初のパラメータはsize_でなければなりません.t.他のパラメータは自分で設計する必要がある.その後、eg. Foo *p = new (300, 'a')Foo; newが呼び出された後のパラメータは、特定のoperator newに第2のパラメータから付与される.オブジェクトをインスタンス化する場合はoperator newを呼び出し、その後コンストラクション関数を呼び出します.この場合、コンストラクション関数が異常を放出すると、リロードすべきoperator deleteが呼び出されます.もちろんコンパイラによってはoperator deleteを呼び出さない場合もあります.対応するoperator delete関数が書かれていない場合、コンパイラはエラーを報告せず、コンストラクション関数の異常を処理しないと考えられます.(この点はvs 2017で実験され、構造中に異常が投げ出され、対応するoperator deleteは実行されなかった.後に他のコンパイラの下で実験される.)
  • placement newの例operator newを再ロードするには、余分なパラメータを追加する必要がある.eg.標準ライブラリのbasic_string文字列にoperator newが再ロードされたのは、参照カウントを設計するためです.

  • ps.時間倉庫、後で完備します.