操作符重載函數(shù)生兆,一般卸載類的內(nèi)部
可以在類的外部實現(xiàn)砸紊,但是內(nèi)部封裝性考慮,最重要的是可以減少參數(shù)的傳遞炊邦。
重載實例說明
① 輸入重載 istream >>
② 輸出重載 ostream <<
③ 前置++ 和后++ 重載 ---注意后置參數(shù)設置
④ 運算符+,- 重載圣蝎,
const 對象 & 別名
系統(tǒng)是這樣寫的 常量引用:不允許修改馋评,只讀模式
& 性能的提高硼瓣,如果沒有& 運行+ 構建新的副本恨闪,會浪費性能
如果增加了& 引用是給這塊內(nèi)存空間取一個別名而已
#include <iostream>
using namespace std;
class David {
public:
David(int x, int y) : x(x), y(y) {
}
David() : x(0), y(0) {
}
// 系統(tǒng)是這樣寫的 常量引用:不允許修改倘感,只讀模式
// const 關鍵字的解釋
// & 性能的提高,如果沒有& 運行+ 構建新的副本咙咽,會浪費性能
// 如果增加了& 引用是給這塊內(nèi)存空間取一個別名而已
David operator + (const David& david) {
// this指針 指向當前對象老玛,所以只需要一個
int x = this->x + david.x; // 我在類的里面,是可以拿私有成員的
int y = this->y + david.y; // 我在類的里面钧敞,是可以拿私有成員的
return David(x, y);
}
// 運算符- 重載
David operator - (const David & david) {
int x = this->x - david.x;
int y = this->y - david.y;
return David(x, y);
}
//++ 對象
void operator++() {
this->x = this->x + 1;
this->y = this->y + 1;
}
//對象++
void operator++(int) {
this->x = this->x + 1;
this->y = this->y + 1;
}
friend istream &operator>>(istream &_START, David &david) {
_START >> david.x >> david.y;
return _START;
}
// 單個輸出
// friend void operator << (ostream & _START,David & david){
// _START << "單個輸出了 "<< david.getX() << "!!!" << david.getY() << endl;
// }
// 多個輸出
friend ostream &operator<<(ostream &_START, const David &david) {
_START << "多個輸出 " << david.getX() << "!!!" << david.getY() << endl;
return _START;
}
int getX() const {
return x;
}
void setX(int x) {
this->x = x;
}
int getY() const {
return y;
}
void setY(int y) {
this->y = y;
}
private:
int x = 0;
int y = 0;
};
int main() {
David res;
//① 輸入重載測試
// cin >> res;
// cout << res.getX() << "," << res.getY() << endl;
//② 輸出重載測試
David david(1000, 2000);
David david2(2000, 4000);
// cout << david;
cout << david << david2;
//③ 前置++ 和后++ 重載
david++;
++david2;
cout << david << david2;
// ④運算符+蜡豹,- 重載,const 對象 & 別名
cout << (david + david2) << david2 - david ;
return 0;
}
3.括號運算符溉苛。 數(shù)組 系統(tǒng)源碼把此括號[i]給重載镜廉, 系統(tǒng)重載后的樣子 *(arr+i)
建議:
能在棧區(qū)的,盡量在棧區(qū)
1.代碼量少
2.避免麻煩
3.怕有問題
4.棧區(qū)的回收愚战,不是你負責的桨吊,責任推卸
#include <iostream>
using namespace std;
// 寫一個小容器威根,模擬容器
class ArrayClass {
private:
// C++ 默認都是系統(tǒng)值 size 系統(tǒng)值 -13275
int size = 0; // 大小 開發(fā)過程中,給size賦默認值视乐,不然會出現(xiàn),后患無窮的問題
int * arrayValue; // 數(shù)組存放 int 類型的很多值
public:
void set(int index, int value) {
arrayValue[index] = value; // []目前不是我的
size+=1;
}
int getSize() { // size成員的目標:是為了循環(huán)可以遍歷
return this->size;
}
// 運算符重載 [index]
int operator[](int index) {
return this->arrayValue[index]; // 系統(tǒng)的
}
};
// 輸出容器的內(nèi)容
void printfArryClass(ArrayClass arrayClass) {
cout << arrayClass.getSize() << endl;
for (int i = 0; i < arrayClass.getSize(); ++i) {
cout << arrayClass[i] << endl; // []是我們自己的 重載符號
}
}
int main() {
ArrayClass arrayClass; // 棧區(qū) 實例出來的對象敢茁,是在堆區(qū)了
arrayClass.set(0, 1000);
arrayClass.set(1, 2000);
arrayClass.set(2, 3000);
arrayClass.set(3, 4000);
arrayClass.set(4, 5000);
printfArryClass(arrayClass);
return 0;
}