一、運算符重載入門技術推演
#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;
};