C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

3つのC++ルール。


三つのルールは、例外セーフコードを作成するための経験則に基づくC++のルールの1つです。これらのルールは、クラスのデフォルトメンバーを例外のない練習に使用する方法を規定しています。

三つのルールは、三つのルールまたは三つのルールとしても知られており、クラスが言及された3つのいずれかを定義する場合、おそらく3つすべてを明示的に定義する必要があることをクラスに規定しています-

  • デストラクタ
  • コピーコンストラクタ
  • コピー代入コンストラクター

これらの3つは、クラスの特別なメンバー関数です。それらのどれもプログラマーによって明示的に定義されていない場合、コンパイラーは暗黙のバージョンを提供します。上記のいずれかが明示的に定義されている場合、それは他の2つの暗黙のバージョンが不適切であり、再定義されている必要があることを意味します。

これは、暗黙的に生成されたコンストラクターと代入演算子がデータメンバーを浅くコピーするために発生します。クラスに動的に割り当てられたリソースを指すポインターが含まれている場合は、ディープコピーが必要です。

デフォルトのデストラクタは、未使用のオブジェクトを削除します。コピーコンストラクタが定義されていない場合、デストラクタは2回実行されます。1回はコピーを含むオブジェクトに対して、2回目はデータメンバーのコピー元のオブジェクトに対して実行されます。これを回避するには、明示的な定義が必要になります。

コピーコンストラクタとコピー代入演算子がないが、デストラクタが存在する例で理解しましょう-

#include <stdio.h>
class Numbers{
private:
   int num;
   int* ptr;
   public:
   Numbers( int n, int* p ) //copy constructor{
      num =n ;
      ptr = new int[ num ];
   }
   ~Numbers() //destructor{
      delete ptr;
      ptr = NULL;
   }
};
int main(){
   int arr[ 4 ] = { 11, 22, 33, 44 };
   Numbers Num1( 4, arr );
   // this creates problem
   Numbers Num2( Num1 );
   return 0;
}

出力

*** Error in `./a.out': double free or corruption (fasttop): 0x0000000001f46c20 ***
Aborted
  • これは、プログラムがスコープ外になったときにデストラクタが2回呼び出されたために発生しました。最初にNum1を削除し、次にNum2を削除します。デフォルトのコピーコンストラクタは、ポインタptrのコピーを作成しますが、メモリは割り当てられません。したがって、Num1が削除されると、後続のptrによってプログラムがクラッシュします。


  1. C ++の3のルールと5のルール?

    三つのルールは、C++を使用する際の経験則です。これは、クラスで次のいずれかが必要な場合にと言う一種の良い習慣のルールです。 コピーコンストラクター 代入演算子 またはデストラクタ 明示的に定義されている場合は、3つすべてが必要になる可能性があります。 どうしてこれなの?これは、クラスが上記のいずれかを必要とする場合、動的に割り当てられたリソースを管理しており、それを正常に達成するには他のリソースが必要になる可能性があるためです。たとえば、代入演算子が必要な場合は、現在参照によってコピーされているオブジェクトのコピーを作成するため、リソースが割り当てられます。コピーにはコピーコンストラ

  2. C ++に関する三つのルールとは何ですか?

    三つのルールは、C++を使用する際の経験則です。これは、クラスで次のいずれかが必要な場合にと言う一種の良い習慣のルールです。 コピーコンストラクター 代入演算子 またはデストラクタ 明示的に定義されている場合は、3つすべてが必要になる可能性があります。 どうしてこれなの?これは、クラスが上記のいずれかを必要とする場合、動的に割り当てられたリソースを管理しており、それを正常に達成するには他のリソースが必要になる可能性があるためです。たとえば、代入演算子が必要な場合は、現在参照によってコピーされているオブジェクトのコピーを作成するため、リソースが割り当てられます。コピーにはコピーコンストラ