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

C++でのコピーの省略


コピーの省略は、コピーの省略とも呼ばれます。これは、コンパイラの最適化手法の1つです。オブジェクトの不要なコピーを回避します。現在のほとんどのコンパイラは、このコピーの省略手法を使用しています。

1つのサンプルコードを使用して、どのように機能するかを見てみましょう。

サンプルコード

#include <iostream>
using namespace std;
class MyClass {
   public:
      MyClass(const char* str = "\0") {  //default constructor
         cout << "Constructor called" << endl;
      }
      MyClass(const MyClass &my_cls) { //copy constructor
         cout << "Copy constructor called" << endl;
      }
};
main() {
   MyClass ob = "copy class object";
}

出力

Constructor called

では、コピーコンストラクターが呼び出されない理由について説明しましょう。

したがって、オブジェクトが構築されているときに、1つの一時オブジェクトが生成され、実際のオブジェクトにコピーされます。したがって、内部的には次のようになります。

MyClass ob = "copy class object";

として機能します:

MyClass ob = MyClass("copy class object");

C ++コンパイラは、この種のオーバーヘッドを回避します


  1. kを超えずにコピー操作をカウントするC++コード

    n個の要素と別の数kの配列Aがあるとします。キャンディーの山はn個あります。 i番目の山にはA[i]個のキャンディーがあります。 2つのインデックスiとj(i!=j)で操作を実行してから、別のA[i]個のキャンディーをA[i]に追加できます(A [i]は減少しません)。この操作は何度でも実行できますが、残念ながら、一部のパイルにk個を超えるキャンディーが厳密に含まれていると、操作を実行できなくなります。この操作を実行できる最大回数を見つける必要があります。 したがって、入力がA =[1、2、3]のような場合。 k =5の場合、出力は5になります。これは、i =0を取ることができ、j =1の場

  2. C++でランダムポインタを使用してリストをコピーする

    リンクリストは線形データ構造であり、各ノードには2つのブロックがあり、一方のブロックにはノードの値またはデータが含まれ、もう一方のブロックには次のフィールドのアドレスが含まれます。 各ノードにリスト内の他のノードを指すランダムポインタが含まれるようなリンクリストがあると仮定します。タスクは、元のリストと同じリストを作成することです。ランダムなポインタを持つ元のリストからリストをコピーすることを、リンクリストの「ディープコピー」と呼びます。 例 入力-1 出力: 5-> 2 -> 3 -> 7 ->4 -> 説明: この問題を解決するためのア