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

C ++プログラミングで独自の代入演算子を作成する必要があるのはいつですか?


ここでは、C++で独自の代入演算子を作成する必要がある場合を確認します。クラスにポインターがない場合は、代入演算子とコピーコンストラクターを作成する必要はありません。 C ++コンパイラは、クラスごとにコピーコンストラクタと代入演算子を作成します。演算子が十分でない場合は、独自の代入演算子を作成する必要があります。

#include<iostream>
using namespace std;
class MyClass { //no user defined assignment operator or copy constructor is present
   int *ptr;
   public:
      MyClass (int x = 0) {
         ptr = new int(x);
      }
      void setValue (int x) {
         *ptr = x;
      }
      void print() {
         cout << *ptr << endl;
      }
};
main() {
   MyClass ob1(50);
   MyClass ob2;
   ob2 = ob1;
   ob1.setValue(100);
   ob2.print();
}

出力

100

main()関数では、ob1のsetValue()メソッドを使用してxの値を設定しました。値はオブジェクトob2にも反映されます。この種の予期しない変更により、問題が発生する可能性があります。ユーザー定義の代入演算子はないため、コンパイラーが作成します。ここでは、RHSのptrをLHSにコピーします。したがって、両方のポインタが同じ場所を指しています。

この問題を解決するには、2つの方法に従うことができます。オブジェクトのコピーを制限するためにダミーのプライベート代入演算子を作成するか、独自の代入演算子を作成することができます。

#include<iostream>
using namespace std;
class MyClass { //no user defined assignment operator or copy constructor is present
   int *ptr;
   public:
      MyClass (int x = 0) {
         ptr = new int(x);
      }
      void setValue (int x) {
         *ptr = x;
      }
      void print() {
         cout << *ptr << endl;
      }
      MyClass &operator=(const MyClass &ob2){
      // Check for self assignment
         if(this != &ob2)
            *ptr = *(ob2.ptr);
         return *this;
      }
};
main() {
   MyClass ob1(50);
   MyClass ob2;
   ob2 = ob1;
   ob1.setValue(100);
   ob2.print();
}

出力

50

ここでは、代入演算子を使用して、ディープコピーを作成し、個別のポインターを格納します。心に留めておくべきことが1つあります。自己参照をチェックする必要があります。そうしないと、代入演算子が現在のオブジェクトの値を変更する可能性があります。


  1. スマートポインタとは何ですか?C ++でいつ使用する必要がありますか?

    スマートポインタは、「raw」(または「bare」)C++ポインタをラップするクラスです。ポインタが指すリソースを管理するために使用されます。たとえば、そのメモリ位置への参照が失われた場合。ガベージコレクターのように機能します。複数のスマートポインタタイプがあります。 ほとんどの場合、スマートポインタを使用する必要があります。これは、ポインタを使用する際の主な問題点が手動のメモリ管理とメモリリークであるためです。スマートポインタは、これらの両方を取り除こうとします。これらのいずれも実際には実行したくない場合は、スマートポインターを使用する必要があります。

  2. C ++で「友達」を使用する必要があるのはいつですか?

    クラスのフレンド関数はそのクラスのスコープ外で定義されていますが、クラスのすべてのプライベートメンバーと保護されたメンバーにアクセスする権利があります。フレンド関数のプロトタイプはクラス定義に表示されますが、フレンドはメンバー関数ではありません。 フレンドは、関数、関数テンプレート、メンバー関数、またはクラスまたはクラステンプレートにすることができます。この場合、クラス全体とそのすべてのメンバーがフレンドになります。 関数をクラスのフレンドとして宣言するには、次のように、クラス定義の関数プロトタイプの前にキーワードfriendを付けます- class Box {    d