C ++ primePlusノート(第12章)

1. newを使用してデストラクタにメモリを割り当てる場合、対応するデストラクタでdeleteを使用してメモリを解放する必要があります。newを使用するクラスには、通常、ディープコピーを実行する表示コピー機能と割り当て演算子を含める必要があります。(以下2を参照)

2.StringBad sports( "Spainshu Leavea"); // StringBadはクラスです呼び出されたコンストラクターの形式は次のとおりです。StringBad(const char * s);

 StringBad sailor = sports; // 1つのオブジェクトで別のオブジェクト初期化します。呼び出されるコンストラクターの形式は、次のとおりです。

 (1)StringBad(const StringBad&st){//コピーコンストラクター

 num_strings ++;

len = st.len; str = new char [len + 1]; std :: strcpy(str、st.str);   }

(2)ディープコピーを実行するクラスオーバーロード割り当て演算子を作成することも必要です。

  StringBad&StringBad :: operator =(const StringBAd&st){

  if(this ==&st)return * this;

 delete [] str; //古い文字列を解放します

len = st.len; str = new char [len + 1]; std :: strcpy(str、st.str);

* thisを返します。}

オブジェクトを値で渡したり返したりするには、どちらもコピーコンストラクターを呼び出します。参照渡しの場合、コンストラクターを呼び出す時間が短縮されます。

3.クラス宣言で宣言され、クラスメソッドのファイルで初期化された静的データ。静的メンバーは、作成されるオブジェクトの数に関係なく静的ですが、静的メンバーのコピーは1つだけ作成されます。

メンバー関数を静的として宣言するために、オブジェクトを介して静的メンバー関数を呼び出すことはできません。また、thisポインターを使用することもできません。静的メンバー関数宣言はパブリック宣言セクションに配置され、クラス名と役割分析演算子を使用して呼び出すことができます

4.クラスにnewで初期化されたポインターメンバーが含まれている場合は、ポインターの代わりにポイントされたデータをコピーするために、自分でコピーコンストラクターを定義する必要があります。これはディープコピーと呼ばれます。浅いコピーはポインタ情報のみをコピーし、ポインタが参照する構造をコピーするために深く掘り下げることはありません。

5.複数のコンストラクターがある場合、それらはすべて同じ方法でnewを使用する必要があります。パラメーターなしのコンストラクターにnewがある場合:

String :: String()

{len = 0; str = new char [1]; str [0] = '\ 0';

デストラクタ:String :: 〜String(){delete [] str;}

6. String * first =&saying [0]; //既存のオブジェクトを指すようにポインタを初期化します 

  String * second = neow String(sayings [1]); // newを使用してポインタを初期化し、新しいオブジェクトを作成して削除します:delete second; //動的オブジェクトのデストラクタ* secondが呼び出されます。

7. char * buffer = new char [512];

   JustTesting * pc1、* pc2; // JustTestingはクラスです

 pc1 = new(buffer)JustTesting; //この文は位置決めの新しい演算子です   

delete pc1; //オブジェクトを破棄するためにデストラクタを明示的に呼び出す必要があります:pc2-> 〜JustTesting();   

削除[]バッファ; //合法

pc2 = new JustTesting( "Heap"、20); //通常の新しい演算子  ... delete pc2; //これは合法であり、自動的にデストラクタを呼び出します

8. C ++ 11 nullポインター:NULL、0、nullptr

9.参照およびconstとして宣言されたクラスメンバーの場合、作成時にメンバー初期化リストメソッドを使用する必要があります:(このメソッドはコンストラクターにのみ使用されます

 (1)クラスキュー{プライベート:..... intアイテム; .const int qsize; };   

   Queue :: Queue(int qs):qsize(qs) {item = 0; フロント=リア= NULL;  } //

または  Queue :: Queue(int qs):qsize(qs)、item(0)、front(NULL)、rear(NULL){}

(2)クラスエージェンシー{...}

   クラスエージェント{プライベート:エージェンシー&belong; .....};

   Agent :: Agent(Agency&a):belong(a){.......}   

10. C ++ 11では、クラス定義の初期化が可能です。

クラスキュー

{プライベート:..... int item = 0; ... const int qsize = Q_SIZE;

};

ただし、メンバー初期化リストを使用するコンストラクターは、対応するクラス内初期化をオーバーライドします。

 

おすすめ

転載: blog.csdn.net/lvliang2017232003/article/details/86515420