いつ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つあります。自己参照をチェックする必要があります。そうしないと、代入演算子が現在のオブジェクトの値を変更する可能性があります。
-
C++の単項演算子
単項演算子は、単一のオペランドに作用して新しい値を生成する演算子です。単項演算子は次のとおりです。 演算子 説明 間接演算子(*) ポインタ変数を操作し、ポインタアドレスの値と同等のl値を返します。これは、ポインタの「逆参照」と呼ばれます。 演算子のアドレス(&) 単項アドレス演算子(&)は、そのオペランドのアドレスを取ります。アドレスオブ演算子のオペランドは、関数指定子またはビットフィールドではなくレジスタストレージクラス指定子で宣言されていないオブジェクトを指定するl値のいずれかです。 単項プラス演算子(+) 単項プラス演算子(+)の結果は
-
C#の代入演算子とは何ですか?
C#の代入演算子を使用して、変数に値を代入します。 以下は、C#の代入演算子です- オペレーター 説明 例 = 単純な代入演算子、右側のオペランドから左側のオペランドに値を代入します C =A + Bは、A+Bの値をCに割り当てます + = AND代入演算子を追加します。これは、右のオペランドを左のオペランドに追加し、結果を左のオペランドに割り当てます。 C +=AはC=C+Aと同等です -= 減算AND代入演算子、左オペランドから右オペランドを減算し、その結果を左オペランドに代入します C-=AはC=C –Aと同等です * = 乗算AND代入演算子、右