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

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


三つのルールは、C++を使用する際の経験則です。これは、クラスで次のいずれかが必要な場合に

と言う一種の良い習慣のルールです。
  • コピーコンストラクター
  • 代入演算子
  • またはデストラクタ

明示的に定義されている場合は、3つすべてが必要になる可能性があります。

どうしてこれなの?これは、クラスが上記のいずれかを必要とする場合、動的に割り当てられたリソースを管理しており、それを正常に達成するには他のリソースが必要になる可能性があるためです。たとえば、代入演算子が必要な場合は、現在参照によってコピーされているオブジェクトのコピーを作成するため、リソースが割り当てられます。コピーにはコピーコンストラクタが必要であり、これらのリソースを解放するにはデストラクタが必要です。

C ++ 11に移動セマンティクスが導入されたため、5のルールは3のルールを拡張したものです。 5の法則は、リソース管理のためにC++でも適用されます。このルールにより、C++コードのメモリリークやその他の問題が解消される可能性があります。ビッグファイブのルールでは、次の関数の1つを作成する必要がある場合は、それらすべてのポリシーを設定する必要があると規定されています。 Object Fooがある場合は、リソースFooを処理するFooManagerを使用できます。 FooManagerを実装する場合、実装するには次の関数が必要になる可能性があります-

  • デストラクタ-このマネージャがスコープ外になると、管理していたすべてのリソースを解放する必要があります。

  • 代入演算子-指定しない場合、コンパイラはデフォルトの代入演算子を作成します。デフォルトの代入操作はメンバー単位のコピー機能であり、ディープコピーではなくシャローコピーを実行します。これにより、メモリリーク、誤った割り当てなどの問題が発生する可能性があります。

  • コピーコンストラクター-コンパイラーが提供するコピーコンストラクターは、すべてのFooManagers属性のメンバーごとのコピーを実行します。これは、代入演算子と同じ問題を引き起こします。

  • コンストラクターの移動-オブジェクトのコピーには、一時オブジェクトの作成、コピー、および破棄が含まれるため、コストがかかる可能性があります。 C ++ 11では、r値参照の概念が導入されました。 r値参照は、r値に明示的にバインドできます。 r値は名前のないオブジェクトです。言い換えれば、一時オブジェクト。このr値参照をコンストラクターで使用して、渡されたr値への参照を作成できます

  • コンストラクターの移動-オブジェクトのコピーには、一時オブジェクトの作成、コピー、および破棄が含まれるため、コストがかかる可能性があります。 C ++ 11では、r値参照の概念が導入されました。 r値参照は、r値に明示的にバインドできます。 r値は名前のないオブジェクトです。言い換えれば、一時オブジェクト。このr値参照をコンストラクターで使用して、渡されたr値への参照を作成できます。

  • ムーブ代入演算子-一度に1つのリソースのみを持つと便利です。このリソースの所有権は、あるマネージャーから別のマネージャーに譲渡できます。このような場合、ムーブ代入演算子を指定できます。

これは、5つのルールについて学ぶための優れたリソースです-https://www.feabhas.com/sites/default/files/2016-06/Rule%20of%20the%20Big%20Five.pdf。


  1. C++で3つのポイントが同一線上にあるかどうかをチェックするプログラム

    3つの異なる値のポイントが与えられ、タスクはポイントが同一線上にあるかどうかを確認することです。 ポイントが同じ線上にある場合は同一線上にあると言われ、異なる線上にある場合は同一線上にありません。以下に、同一線上および非同一線上の点の図を示します。 入力 x1 = 1, x2 = 2, x3 = 3, y1 = 1, y2 = 4, y3 = 5 出力 no points are not collinear 入力 x1 = 1, y1 = 1, x2 = 1, y2 = 4, x3 = 1, y3 = 5 出力 points are collinear 以下のプログラム

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

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