【C++】演算子のオーバーロード② (クラス内で定義されたクラウド演算子のオーバーロード - メンバー関数 | クラス外で定義された演算子のオーバーロード - グローバル関数 | オーバーロード可能な演算子)





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



演算子のオーバーロードの本質は「関数呼び出し」です。

+を使用した場合は2 2になります2 つのオブジェクトを追加する場合、C++ コンパイラは演算子オーバーロード関数が定義されているかどうかを検索します。

	// 自定义类型相加
	Student s1(10, 120), s2(18, 170);
	Student s3, s4, s5;

	// 运算符重载
	s5 = s1 + s2;

演算子オーバーロード関数が見つかった場合は、2 2を置き換えて関数の内容が実行されます。2 つのオブジェクトが加算演算を実行します。演算子がオーバーロードされた関数が見つからない場合は、エラーが報告されます。

エラーメッセージは次のとおりです。

error C2676: 二进制“+:“Student”不定义该运算符或到预定义运算符可接收的类型的转换
1>已完成生成项目“HelloWorld.vcxproj”的操作 - 失败。




2. 演算子のオーバーロード構文 - クラス内で定義されたクラウド演算子のオーバーロード (メンバー関数)




1. 演算子のオーバーロード関数の構文の説明


C++ では、加算や減算によく使用される成熟した演算子などの演算子の動作を再定義でき、オーバーロードが可能であり、演算子の操作をカスタマイズできます。

クラウド演算子のオーバーロードはクラス内で定義されており、形式は戻り値の型(クラス名)演算子演算子記号(constパラメータ型名パラメータ変数名){メソッド内容}」パラメータの型は参照型です

加算演算子のオーバーロード(「+」演算子のオーバーロード) では、2 つの Operator の Number メンバー変数を加算し、その Number メンバー変数の値が 2 つの Operator の Number メンバー変数である新しい Operator オブジェクトを返します。

//运算符重载 , "+" 号运算符进行重载 , 
//其作用是让两个 Operator 的 number 成员变量相加
//运算符重载的本质是按照一定格式定义一个方法
//这个定义的方法中包含运算符 , 除运算符之外的其它符号可以省略简写
public:
	Operator operator+(const Operator& o1) {
    
    
		//+ 运算符的作用是 两个 Operator 对象, 进行操作得到第三个 Operator 对象
		//第三个 Operator 对象的 number 变量 , 是前两个 Operator 对象之和
		Operator o2;
		o2.number = this->number + o1.number;
		return o2;
	}

演算子のオーバーロードの本質はメソッドを定義することです。メソッドには定義するための固定形式があります。メソッドを呼び出すときは、関数形式で呼び出すことも、演算子を使用して計算を実行することもできます。その本質はやはりクラスの関数呼び出しです


2. 関数呼び出しをオーバーロードする演算子


オーバーロードされた演算子は完全に呼び出されます。つまり、上で定義されたメソッド全体が呼び出されますoperator+。これは、正式な関数呼び出しメソッドです。

	//这是运算符重载的完整写法 , 
	//其中的 .operator 和之后的 () 可以省略变成下面的简化写法
	Operator o3 = o1.operator+(o2);
	//打印 o3 中的 number 变量值
	cout << "内部定义的运算符重载完整写法结果 : " << o3.number << endl;

演算子のオーバーロードにより呼び出しが簡素化されます (推奨)。この種の呼び出しは演算子操作であり、書き込みメソッドは"オブジェクト 1 演算子 オブジェクト 2"です。結果はオブジェクト 3 です。この呼び出しメソッドと上記の呼び出しメソッドの違いは、 と が省略されていることです.operator。呼び出しの外側のパラメータ()

	//+ 是在 Operator 类中自定义的运算符重载 
	//其作用是返回一个对象 , 其number成员变量值是 o1 和 o2 中number成员变量之和
	Operator o4 = o1 + o2;
	//打印 o3 中的 number 变量值
	cout << "内部定义的运算符重载简化写法结果 : " << o4.number << endl;

3. コード例 - 演算子によるオーバーロードされた関数呼び出し


演算子のオーバーロード呼び出し完了コード:

	//运算符重载
	//注意这里的 Operator 对象 o1 和 o2 都在栈内存中
	Operator o1;
	o1.number = 80;

	Operator o2;
	o2.number = 10;

	//运算符重载完整写法

	//这是运算符重载的完整写法 , 
	//其中的 .operator 和之后的 () 可以省略变成下面的简化写法
	Operator o3 = o1.operator+(o2);
	//打印 o3 中的 number 变量值
	cout << "内部定义的运算符重载完整写法结果 : " << o3.number << endl;

	//运算符重载简化写法

	//+ 是在 Operator 类中自定义的运算符重载 
	//其作用是返回一个对象 , 其number成员变量值是 o1 和 o2 中number成员变量之和
	Operator o4 = o1 + o2;
	//打印 o3 中的 number 变量值
	cout << "内部定义的运算符重载简化写法结果 : " << o4.number << endl;

コードの実行結果:

内部定义的运算符重载完整写法结果 : 90
内部定义的运算符重载简化写法结果 : 90




3. 演算子のオーバーロード構文 - クラス外で定義された演算子のオーバーロード (グローバル関数)




1. 演算子のオーバーロード関数の構文の説明


演算子のオーバーロードはクラスの外で定義されます。演算子のオーバーロードはクラスの外でも定義できます。クラス ヘッダー ファイルを含む任意のコード内に含めることができます。定義メソッドはクラス内の定義と比較されます。パラメーターのみが異なります。はクラスの外で定義されています。オペレータ操作の 2 つのパラメータを表す 2 つのパラメータが必要です。

乗算演算子のオーバーロード。「*」演算子がオーバーロードされます。その機能は、2 つの Operator の Number メンバー変数を乗算して、新しい Operator オブジェクトを返すことです。その Number メンバー変数の値は、次の 2 つの Operator の積の Number メンバー変数です。価値観。

//类外部定义云算符重载
//	使用该重载云算符时 , 将两个对象相乘 , 获得的第三个对象 , 
//	该对象的 number 成员变量值 , 是 前两个对象的 number 对象的乘积 
Operator operator*(const Operator& o1, const Operator& o2) {
    
    
	//+ 运算符的作用是 两个 Operator 对象, 进行操作得到第三个 Operator 对象
	//第三个 Operator 对象的 number 变量 , 是前两个 Operator 对象之和
	Operator o3;
	o3.number = o1.number * o2.number;
	return o3;
}

2. 関数呼び出しをオーバーロードする演算子


オーバーロードされた演算子を呼び出すには、演算子のオーバーロードoperator*()メソッドを直接呼び出すことも、演算子o1 * o2;を直接使用することもできます。


	//运算符重载
	//注意这里的 Operator 对象 o1 和 o2 都在栈内存中
	Operator o1;
	o1.number = 80;

	Operator o2;
	o2.number = 10;

	//这是运算符重载的完整写法 , 
	//其中的 .operator 和之后的 () 可以省略变成下面的简化写法
	Operator o5 = operator*(o1, o2);
	//打印 o5 中的 number 变量值
	cout << "外部定义的运算符重载完整写法结果 : " << o5.number << endl;

	//运算符重载简化写法

	//+ 是在 Operator 类中自定义的运算符重载 
	//其作用是返回一个对象 , 其number成员变量值是 o1 和 o2 中number成员变量之积
	Operator o6 = o1 * o2;
	//打印 o6 中的 number 变量值
	cout << "外部定义的运算符重载简化写法结果 : " << o6.number << endl;

コードの実行結果

外部定义的运算符重载完整写法结果 : 800
外部定义的运算符重载简化写法结果 : 800




4. オーバーロード可能な演算子



オーバーロード可能な演算子のリストは次のとおりです。

演算子の種類 このタイプのオーバーロード可能な演算子をすべてリストします。
比較演算子(二項演算子) == (等しい)、!= (等しくない)、< (より小さい)、> (より大きい)、<= (以下)、>= (以上)
論理演算子(二項演算子) && (および)、|| (または)、! (不一致)
数値計算演算子(二項演算子) +(加算)、-(減算)、*(乗算)、/(除算)
ビット演算子(二項演算子) | (ビット単位の OR 演算)、& (ビット単位の AND 演算)、~ (ビット単位の否定演算)、^ (ビット単位の XOR 演算)、<< (左シフト演算)、>> (右シフト演算)
代入演算子(二項演算子) = (等しい)、+= (プラスの等しい)、-= (等しい減算)、*= (等しい乗算)、/= (等しい除算)、% = (剰余の等しい)、&= (ビットごとの AND の等しい)、| = (ビット単位の OR が等しい)、^= (ビット単位の XOR が等しい)、<<= (左シフトが等しい)、>>= (右シフトが等しい)
単項演算子 + (正の番号記号)、- (負の番号記号)、* (ポインター型)、& (アドレス演算子)、++ (インクリメント演算子)、- (デクリメント演算子)
メモリ割り当て解放演算子 new (新しいオブジェクト)、new[] (新しい配列オブジェクト)、delete (オブジェクトの解放)、delete[] (配列オブジェクトの解放)
関数呼び出し演算子 ()
メンバーアクセス演算子 ->
添字演算子 []
カンマ演算子

おすすめ

転載: blog.csdn.net/han1202012/article/details/133513060