1. 程式人生 > >運算子過載 過載的兩種方法 +

運算子過載 過載的兩種方法 +

一、運算子過載入門技術推演

#include<iostream>
using namespace std;

class Complex
{
public:
	int a;
	int b;
public:
	Complex(int a = 0,int b = 0)
	{
		this->a = a;
		this->b = b;
	}
	void printCom()
	{
		cout<<a<<"+"<<b<<"i"<<endl;
	}
protected:
private:
};
//定義 了全域性函式
Complex myAdd(Complex &c1,Complex &c2)
{
	Complex tmp(c1.a + c2.a,c1.b + c2.b);
	return tmp;
}
//全域性函式 完成 +操作符  過載
//Complex operator+(Complex &c1,Complex &c2)

//函式名  升級 
Complex operator+(Complex &c1,Complex &c2)
{
	Complex tmp(c1.a + c2.a,c1.b + c2.b);
	return tmp;
}


int main()
{
	
	int a = 0;
	int b = 0;
	int c;
	//一、a和b是基礎資料型別 編譯器已經知道如何運算
	c = a + b;
	
	 //a + bi複數運算規則
	Complex c1(1,2),c2(3,4);
	Complex c3;//二、類 也是一個數據型別 使用者自定義的資料型別,c++編譯器預設不知道如何運算的
	//c3 = c1 + c2;//報錯
	//三、c++編譯器應該給我們程式設計師提供一種機制。。。
	//讓自定義資料型別有機會進行運算子操作====》這就是傳說的運算子過載

	//四、運算子過載機制
	//步驟一
//	Complex c4 = myAdd(c1,c2);
//	c4.printCom();
	//步驟二---》complex c4 = c1 + c2;


	//步驟二
	//Complex c4 = operator+(c1,c2);
	//c4.printCom();
	//步驟三與步驟二的效果一樣
	Complex c4 =c1 + c2;//不再報錯了
	c4.printCom();


	/*總結:
		1:運算子過載 本質 是一個函式呼叫*/
		
	system("pause");
	return 0;
}
二、運算子過載的兩種方法
#include<iostream>
using namespace std;

class Complex
{
public:
	int a;
	int b;
public:
	Complex(int a = 0,int b = 0)
	{
		this->a = a;
		this->b = b;
	}
	void printCom()
	{
		cout<<a<<"+"<<b<<"i"<<endl;
	}

//2:成員函式方法 實現 - 運算子過載
	Complex operator-(Complex &c2)
	{	
		Complex tmp(1,2);
		return tmp;
	}
protected:
private:
};
//1:全域性函式法 實現 + 運算子過載
Complex operator+(Complex &c1,Complex &c2)
{
	Complex tmp(c1.a + c2.a ,c1.b + c2.b);
	return tmp;
}


int main()
{
/*
	定義運算子過載函式名的步驟
		全域性函式、類成員函式方法實現運算子過載步驟
		1)要承認操作符過載是一個函式,寫出函式名稱operator+ () 
		2)根據運算元,寫出函式引數 
		3)根據業務,完善函式返回值(看函式是返回引用 還是指標 元素),及實現函式業務
*/

	Complex c1(1,2),c2(3,4);
	
	//1:全域性函式法 實現 + 運算子過載
	//Complex operator+(Complex &c1,Complex &c2) 
	Complex c3 = c1 + c2;
	c3.printCom();

	//2:成員函式方法 實現 - 運算子過載
	//c1.operator-(this,c2);
	//Complex operator+(Complex &c2);
	
	system("pause");
	return 0;
}

三、運算子過載的升級--使用友元函式 + 前置後置運算子過載

自增自減運算子

(1)字首形式

前置形式  返回  改變後的物件,在成員運算子函式中返回 *this ;在全域性運算函式中    返回  修改後的引數

(2)字尾形式

字尾形式 返回 改變之前的值,需要建立一個物件代表這個值的獨立物件並返回它,因此後綴運算是通過傳值方式返回的。

TV

概括來講:前置返回物件引用,後置先建立物件後返回舊值

#include<iostream>
using namespace std;

class Complex
{
private://此處升級版
	int a;
	int b;
	//全域性函式 過載+運算子
	friend Complex operator+(Complex &c1,Complex &c2);
	//過載前置 ++ 運算子 ----友元函式
	friend Complex& operator++(Complex &c1);
public:
	Complex(int a = 0,int b = 0)
	{
		this->a = a;
		this->b = b;
	}
	void printCom()
	{
		cout<<a<<"+"<<b<<"i"<<endl;
	}

//2:成員函式方法 實現 - 運算子過載

	Complex operator-(Complex &c2)
	{	
		Complex tmp(this->a - c2.a,this->b - c2.b);
		return tmp;
	}
//2:成員函式方法 實現 -- 運算子過載
	Complex& operator--()
	{
		this->a--;
		this->b--;
		return *this;
	}
protected:
private:
};
//1:全域性函式法 實現 + 運算子過載
Complex operator+(Complex &c1,Complex &c2)
{
	Complex tmp(c1.a + c2.a ,c1.b + c2.b);
	return tmp;
}
//前置++
Complex& operator++(Complex &c1)
{
	c1.a++;
	c1.b++;
	return c1;
}
//後置++ ====== 函式的返回值不是函式過載的標準
Complex operator++(Complex &c1,int)//新的語法佔位符
{
	Complex tmp(0,0);
	return tmp;
}

int main()
{
/*
	定義運算子過載函式名的步驟
		全域性函式、類成員函式方法實現運算子過載步驟
		1)要承認操作符過載是一個函式,寫出函式名稱operator+ () 
		2)根據運算元,寫出函式引數 
		3)根據業務,完善函式返回值(看函式是返回引用 還是指標 元素),及實現函式業務
*/

	Complex c1(1,2),c2(3,4);
	
	//1:全域性函式法 實現 + 運算子過載
	//Complex operator+(Complex &c1,Complex &c2) 
	Complex c3 = c1 + c2;
	c3.printCom();

	//2:成員函式方法 實現 - 運算子過載
	//c1.operator-(this,c2);
	//Complex operator+(Complex &c2);
	Complex c4 = c1 - c2;
	c4.printCom();


	//前置++操作符 用全域性函式實現
	//Complex& operator++(Complex &c1);
	++c1;
	c1.printCom();

	//前置--操作符 用成員函式實現
	//Complex& operator--();
	--c1;
	c1.printCom();

	//後置++操作符 用全域性函式實現
	//Complex operator++(Complex &c1);//返回元素--與前置++不一樣
	c1++;
	c1.printCom();
	
	system("pause");
	return 0;
};