【C++】演算子のオーバーロード④ (単項演算子のオーバーロード | グローバル関数を使用してプレフィックス ++ の自動インクリメント演算子のオーバーロードを実装 | グローバル関数を使用してプレフィックス - - 自動デクリメント演算子のオーバーロードを実装)





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




1. 単項演算子の一覧


単項演算子:単項演算子とも呼ばれます

  • 否定演算子: -
  • 逆参照演算子: *
  • アドレス取得演算子: &
  • 自動インクリメント演算子: ++ 。この演算子は、接頭辞と接尾辞の 2 つのタイプに分かれています。
  • デクリメント演算子: – 、この演算子は、接頭辞と接尾辞の 2 つのタイプに分かれています。

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

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

3. グローバル関数を使用してプレフィックス ++ 自動インクリメント演算子のオーバーロードを実装する


グローバル関数を使用して、先頭に追加された ++ インクリメント演算子のオーバーロードを実装します。

  • まず関数名を書きます。関数名ルールは「operate」の後にオーバーロードする演算子を付けます。関数名はoperate++;です。
operate++
  • 次に、 オペランドに従って関数パラメータを記述します。パラメータは通常、オブジェクトへの参照です。
    • メンバー関数:パラメーターは1 1です次のようなオブジェクトへの定数参照operate+(const Student& s1)
    • グローバル関数:パラメータは2 2次のような2 つのオブジェクトへの参照:operate+(Student& s1, Student& s2)
operator++(Student& s)
  • 次に、 戻り値の業務改善に応じて、戻り値を参照/ポインタ/要素にすることができます (例: 戻り値は要素ですStudent operate+(Student& s1, Student& s2)。ここでは、Student&s パラメータの属性が変更されているため、Student&s のパラメータ自体を返すときにも返す必要があるため、戻り値は Student& 参照型になります。
Student& operator++(Student& s)
  • 最後に、関数本体を実装し、ビジネス ロジックを操作するための特定の演算子を作成します。
// 使用 全局函数 实现 前置 ++ 自增运算符重载
// 重载 前置 ++ 运算符
// 实现 1 个 Student 对象 自增运算
// 由于 参数中的 Student& s 中的属性发生了变化 
// 返回时仍需要返回 Student& s 参数本身
Student& operator++(Student& s)
{
    
    
	s.age++;
	s.height++;
	return s;
};

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

	// 使用 全局函数 实现 前置 ++ 自增运算符重载
	friend Student& operator++(Student& s);

4. グローバル関数を使用して事前配置 - デクリメント演算子のオーバーロードを実装する


グローバル関数を使用して接頭辞 - デクリメント演算子のオーバーロードを実装します。

  • まず関数名を書きます。関数名ルールは「operate」の後にオーバーロードする演算子を付けます。関数名はoperate--;です。
operate--
  • 次に、 オペランドに従って関数パラメータを記述します。パラメータは通常、オブジェクトへの参照です。
    • メンバー関数:パラメーターは1 1です次のようなオブジェクトへの定数参照operate+(const Student& s1)
    • グローバル関数:パラメータは2 2次のような2 つのオブジェクトへの参照:operate+(Student& s1, Student& s2)
operator--(Student& s)
  • 次に、 戻り値の業務改善に応じて、戻り値を参照/ポインタ/要素にすることができます (例: 戻り値は要素ですStudent operate+(Student& s1, Student& s2)。ここでは、Student&s パラメータの属性が変更されているため、Student&s のパラメータ自体を返すときにも返す必要があるため、戻り値は Student& 参照型になります。
Student& operator--(Student& s)
  • 最後に、関数本体を実装し、ビジネス ロジックを操作するための特定の演算子を作成します。
// 使用 全局函数 实现 前置 -- 自减运算符重载
// 重载 前置 -- 运算符
// 实现 1 个 Student 对象 自减运算
// 由于 参数中的 Student& s 中的属性发生了变化 
// 返回时仍需要返回 Student& s 参数本身
Student& operator--(Student& s)
{
    
    
	s.age--;
	s.height--;
	return s;
};

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

	// 使用 全局函数 实现 前置 -- 自增运算符重载
	friend Student& operator--(Student& s);




2. 完全なコード例



コード例:

#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);

	// 使用 全局函数 实现 前置 ++ 自增运算符重载
	friend Student& operator++(Student& s);

	// 使用 全局函数 实现 前置 -- 自增运算符重载
	friend Student& operator--(Student& s);

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

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

// 使用 全局函数 实现 前置 ++ 自增运算符重载
// 重载 前置 ++ 运算符
// 实现 1 个 Student 对象 自增运算
// 由于 参数中的 Student& s 中的属性发生了变化 
// 返回时仍需要返回 Student& s 参数本身
Student& operator++(Student& s)
{
    
    
	s.age++;
	s.height++;
	return s;
};

// 使用 全局函数 实现 前置 -- 自减运算符重载
// 重载 前置 -- 运算符
// 实现 1 个 Student 对象 自减运算
// 由于 参数中的 Student& s 中的属性发生了变化 
// 返回时仍需要返回 Student& s 参数本身
Student& operator--(Student& s)
{
    
    
	s.age--;
	s.height--;
	return s;
};

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

	++s1;
	s1.print();

	--s1;
	s1.print();

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

    return 0;
};

の結果:

age = 11 , height = 121
age = 10 , height = 120
请按任意键继续. . .

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

おすすめ

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