【C++】演算子のオーバーロード③ (二項演算子のオーバーロード | 演算子のオーバーロード手順 | 演算子のオーバーロードを実現するグローバル関数 | 演算子のオーバーロードを実現するメンバー関数 | 演算子のオーバーロードを実現するフレンド関数)





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




1. 演算子のオーバーロード手順の説明


演算子のオーバーロード手順:

  • まず、関数名を記述します。関数名の規則は、「operate」の後に、オーバーロードされる演算子が続きます (operate+プラス演算子のオーバーロードなど) 。
  • 次に、 オペランドに従って関数パラメータを記述します。パラメータは通常、オブジェクトへの参照です。
    • メンバー関数:パラメーターは1 1です次のようなオブジェクトへの定数参照operate+(const Student& s1)
    • グローバル関数:パラメータは2 2次のような2 つのオブジェクトへの参照:operate+(Student& s1, Student& s2)
  • 次に、 ビジネス完全な戻り値に従って、戻り値は参照/ポインター/要素になる可能性があります。たとえば、戻り値は要素です。Student operate+(Student& s1, Student& s2)
  • 最後に、関数本体を実装し、ビジネス ロジックを操作するための特定の演算子を作成します。

2. 演算子のオーバーロードクラス


以下では、Student クラスを例として、メンバー関数/グローバル関数実装演算子のオーバーロード コードを記述します。

class Student
{
    
    
public:
	// 带参构造函数 , 为参数设置默认值
	Student(int age = 1, int height = 1)
	{
    
    
		this->age = age;
		this->height = height;
	};

public:
	// 打印类数据
	void print()
	{
    
    
		cout << "age = " << age << " , height = " << height << endl;
	};

public:
	int age;		// 年龄
	int height;		// 身高
};

3. グローバル関数は演算子のオーバーロードを実装します。


グローバル関数を使用して演算子のオーバーロードを実装し、+ 演算子をオーバーロードします。


グローバル関数は演算子のオーバーロードを実装します。

  • まず関数名を書きます。関数名ルールは「operate」の後にオーバーロードする演算子を付けます。関数名はoperate+;です。
operate+
  • 次に、 オペランドに従って関数パラメータを記述します。パラメータは通常、オブジェクトへの参照です。
    • メンバー関数:パラメーターは1 1です次のようなオブジェクトへの定数参照operate+(const Student& s1)
    • グローバル関数:パラメータは2 2次のような2 つのオブジェクトへの参照:operate+(Student& s1, Student& s2)
operate+(Student& s1, Student& s2)
  • 次に、 ビジネス完全な戻り値に従って、戻り値は参照/ポインター/要素になる可能性があります。たとえば、戻り値は要素です。Student operate+(Student& s1, Student& s2)
Student operator+(Student& s1, Student& s2)
  • 最後に、関数本体を実装し、ビジネス ロジックを操作するための特定の演算子を作成します。
// 使用 全局函数 实现 运算符重载 
// 重载 + 运算符
// 实现两个 Student 对象相加
Student operator+(Student& s1, Student& s2)
{
    
    
	Student student(s1.age + s2.age, s1.height + s2.height);
	return student;
};

4. メンバー関数は演算子のオーバーロードを実装します。


メンバー関数を使用して演算子のオーバーロード、オーバーロード - 演算子を実装します。


メンバー関数は演算子のオーバーロードを実装します。

  • まず関数名を書きます。関数名ルールは「operate」の後にオーバーロードする演算子を付けます。関数名はoperate-;です。
operate-
  • 次に、 オペランドに従って関数パラメータを記述します。パラメータは通常、オブジェクトへの参照です。
    • メンバー関数:パラメーターは1 1です次のようなオブジェクトへの定数参照operate+(const Student& s1)
    • グローバル関数:パラメータは2 2次のような2 つのオブジェクトへの参照:operate+(Student& s1, Student& s2)
operator-(Student& s)
  • 次に、 ビジネスに応じて戻り値を完成させます。戻り値は参照/ポインター/要素にすることができます。
Student operator-(Student& s)
  • 最後に、関数本体を実装し、ビジネス ロジックを操作するための特定の演算子を作成します。
public:
	// 使用 成员函数 实现 运算符重载 
	// 重载 - 运算符
	// 实现两个 Student 对象相加
	Student operator-(Student& s)
	{
    
    
		Student student(this->age - s.age, this->height - s.height);
		return student;
	};

5. 完全なコード例


コード例:

#include "iostream"
using namespace std;

class Student
{
    
    

public:
	// 带参构造函数 , 为参数设置默认值
	Student(int age = 1, int height = 1)
	{
    
    
		this->age = age;
		this->height = height;
	};

public:
	// 打印类数据
	void print()
	{
    
    
		cout << "age = " << age << " , height = " << height << endl;
	};

public:
	// 使用 成员函数 实现 运算符重载 
	// 重载 - 运算符
	// 实现两个 Student 对象相加
	Student operator-(Student& s)
	{
    
    
		Student student(this->age - s.age, this->height - s.height);
		return student;
	};

private:
	int age;		// 年龄
	int height;		// 身高
};

// 使用 全局函数 实现 运算符重载 
// 重载 + 运算符
// 实现两个 Student 对象相加
Student operator+(Student& s1, Student& s2)
{
    
    
	Student student(s1.age + s2.age, s1.height + s2.height);
	return student;
};

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

	s3 = s1 + s2;
	s3.print();

	s4 = s1 - s2;
	s4.print();

    // 控制台暂停 , 按任意键继续向后执行
    system("pause");

    return 0;
};

の結果:

age = 28 , height = 290
age = -8 , height = -50
请按任意键继续. . .

ここに画像の説明を挿入します





2. Friend 関数は演算子のオーバーロードを実装します。




1. Friend 関数は演算子のオーバーロードを実装します。


クラス内のメンバーがすべてプライベート メンバーの場合、

演算子のオーバーロードでは、計算のためにプライベート メンバーにアクセスする必要があります。

メンバー関数ではプライベートメンバーに通常通りアクセスできますが、

ただし、グローバル関数ではプライベート メンバーにアクセスできません。


このとき、グローバル関数 (フレンド関数) 内のプライベート メンバーにアクセスできるように、グローバル関数をクラスのフレンド関数として宣言する必要があります。


クラス内のメンバー変数はプライベート メンバーです。

private:
	int age;		// 年龄
	int height;		// 身高

クラス内のプライベート メンバーにアクセスするグローバル関数が定義されています。

// 使用 全局函数 实现 运算符重载 
// 重载 + 运算符
// 实现两个 Student 对象相加
Student operator+(Student& s1, Student& s2)
{
    
    
	Student student(s1.age + s2.age, s1.height + s2.height);
	return student;
};

グローバル関数はフレンド関数として宣言する必要がありますが、この時点では、グローバル関数は演算子のオーバーロードの通常の実行を実装するために使用されます。

private:
	friend Student operator+(Student& s1, Student& s2);

2. コード例 - Friend 関数は演算子のオーバーロードを実装します。


コード例:

#include "iostream"
using namespace std;

class Student
{
    
    
public:
	// 带参构造函数 , 为参数设置默认值
	Student(int age = 1, int height = 1)
	{
    
    
		this->age = age;
		this->height = height;
	};

public:
	// 打印类数据
	void print()
	{
    
    
		cout << "age = " << age << " , height = " << height << endl;
	};

public:
	// 使用 成员函数 实现 运算符重载 
	// 重载 - 运算符
	// 实现两个 Student 对象相加
	Student operator-(Student& s)
	{
    
    
		Student student(this->age - s.age, this->height - s.height);
		return student;
	};

private:
	friend Student operator+(Student& s1, Student& s2);

private:
	int age;		// 年龄
	int height;		// 身高
};

// 使用 全局函数 实现 运算符重载 
// 重载 + 运算符
// 实现两个 Student 对象相加
Student operator+(Student& s1, Student& s2)
{
    
    
	Student student(s1.age + s2.age, s1.height + s2.height);
	return student;
};

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

	s3 = s1 + s2;
	s3.print();

	s4 = s1 - s2;
	s4.print();

    // 控制台暂停 , 按任意键继续向后执行
    system("pause");

    return 0;
};

の結果:

age = 28 , height = 290
age = -8 , height = -50
请按任意键继续. . .

ここに画像の説明を挿入します

おすすめ

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