[C++] 演算子のオーバーロードと代入演算子のオーバーロード (明示的およびデフォルト)、および ++ 前および ++ 後のオーバーロードの特性と形式


序文

`

C++ では、コードの可読性を高めるために演算子のオーバーロードが導入されています。演算子のオーバーロードは、特別な関数名を持つ関数であり、戻り値の型、関数名、およびパラメーターのリストも存在します。戻り値の型とパラメーターのリストは、通常の関数と似ています。

1. 演算子のオーバーロード

関数名は、キーワード演算子の後に、オーバーロードする必要がある演算子記号が続きます。
関数プロトタイプ:戻り値型演算子演算子(パラメータリスト)

注:
1...他のシンボルを接続して新しい演算子を作成することはできません (operator@ など)。
2. オーバーロードされた演算子にはクラス型パラメーターが必要です。
3. 組み込み型に使用される演算子の意味は変更できません。例: 組み込みの整数 + は、その意味を変更できません。クラスのメンバー関数
としてオーバーロードされるとメンバー関数の最初のパラメーターが非表示のこの4であるため、その仮パラメーターはオペランドの数より 1 少ないように見えます。
. . :: sizeof ?: . * 注 上記の 5 つの演算子はオーバーロードできません。これは、記述式の多肢選択問題でよく出てきます。

グローバル演算子<:
ここに画像の説明を挿入
したがって、通常、演算子オーバーロード関数をグローバル関数として記述せず、メンバー関数としてクラスに記述します。
ここですべての比較を記述します。

ここに画像の説明を挿入
ここに画像の説明を挿入

2. 代入演算子のオーバーロード

Date&operator=(const Date& x) {
    
    
		//赋值重载函数
		if ( this != &x) {
    
    
			_year = x. _year;
			_month = x._month;
			_day = x._day;
		}
		return *this;
	}

1. 代入演算子のオーバーロード形式:

1. パラメータの型: const T&、参照を渡すことでパラメータの受け渡しの効率が向上します
2. 戻り値の型: T&、参照を返すことで戻りの効率が向上します、戻り値の目的は連続代入をサポートすることです

ここに画像の説明を挿入
ここに画像の説明を挿入
。代入 (void の場合) 代入後は d2 が d3 の値になるため、型はエラーを報告しますが、d2=d3 の全体的なレベルと d2.operator (d3) の戻り値は void になり、d1 に代入されます。エラーを報告する

3. 自分自身に値を割り当てているかどうかを確認します>
ここに画像の説明を挿入

4. *this: を返して、連続代入の意味をさらに複雑にします。

2. ユーザーが明示的に実装しない場合、コンパイラはデフォルトの代入演算子のオーバーロードを生成します。これは値の形式でバイトごとにコピーされます。

注: 組み込み型のメンバー変数は直接割り当てられますが、カスタム型のメンバー変数は、割り当てを完了するために対応するクラスの代入演算子オーバーロードを呼び出す必要があります。

デフォルトでは、代入オーバーロードとコピー構築の動作は同じです。
1. 組み込み型メンバーの値のコピー/浅いコピー
2. カスタム型メンバー: 代入オーバーロードを呼び出します。
3. 代入にメモリ解放などが含まれる場合、ディープ コピーは自分で実装する必要があります。そうしないと間違いが起こりやすくなります。また、場合によっては、コンパイラに作成させることもできます。
ここに画像の説明を挿入

3. 代入演算子はクラスのメンバー関数としてのみオーバーロードでき、グローバル関数としてオーバーロードできません。

クラスにメンバーが存在しない場合、そのクラスは単に空のクラスと呼ばれます。
空のクラスには本当に何もないのでしょうか?いいえ、どのクラスも何も書き込まない場合、コンパイラは次の 6 つのデフォルトのメンバー関数を自動的に生成します。
デフォルトのメンバー関数: ユーザーによる明示的な実装を行わずにコンパイラによって生成されたメンバー関数は、デフォルトのメンバー関数と呼ばれます。

ここに画像の説明を挿入
代入オーバーロード関数もこれら 6 つの関数の中にあります。代入オーバーロード関数をグローバル関数として定義すると、コンパイラはクラスに代入オーバーロード関数が記述されていないと判断し、代入オーバーロード関数を生成します。これは、グローバルで定義した代入オーバーロード関数と矛盾します。

3. フロント++とポスト++

ここに画像の説明を挿入

1. 2 つのオブジェクト間にはすでにコピーがあります: 演算子オーバーロード関数
2. 既存のオブジェクトを使用して別のオブジェクトを初期化します: コンストラクター

Supongo que te gusta

Origin blog.csdn.net/m0_74774759/article/details/130777917
Recomendado
Clasificación