標籤:
什麼是重載:讓操作符具有自己想要的功能。
#ifndef _ARRAY_H_#define _ARRAY_H_class Array{private: int mLength; int* mSpace;public: Array(int length); Array(const Array& obj); int length(); void setData(int index, int value); int getData(int index); ~Array(); // 重載[]操作符,從數組類中取值(int類型) int &operator[](int i); // 重載操作符=,複製數組類 Array& operator=(Array &aa); // 重載操作符==,比較兩個數組類是否相同 bool operator==(Array &aa);};#endifArray.h
#include "iostream"#include "Array.h"using namespace std;Array::Array(int length){ if( length < 0 ) { length = 0; } mLength = length; mSpace = new int[mLength];}Array::Array(const Array& obj){ mLength = obj.mLength; // 開闢mLength大小的記憶體空間mSpace mSpace = new int[mLength]; for(int i=0; i<mLength; i++) { mSpace[i] = obj.mSpace[i]; }}int Array::length(){ return mLength;}void Array::setData(int index, int value){ mSpace[index] = value;}int Array::getData(int index){ return mSpace[index];}Array::~Array(){ mLength = -1; delete[] mSpace;}int& Array::operator[](int i){ return this->mSpace[i];}Array& Array::operator=(Array &aa){ int i = 0; if(this->mSpace != NULL) { free(mSpace); } this->mLength = aa.mLength; mSpace = new int[mLength]; for(i=0; i<mLength; i++) { (*this)[i] = aa[i]; } return (*this);}bool Array::operator==(Array &aa){ int i = 0; if(this->mLength != aa.mLength) { return false; } for(i=0; i<this->mLength; i++) { if(mSpace[i] != aa.mSpace[i]) { return false; } } return true;}Array.cpp
#include "iostream"#include "Array.h"using namespace std;int main(){ Array a1(10); for(int i=0; i<a1.length(); i++) { //a1.setData(i, i); //改寫[] 功能一 a1[i] = i; } for(int i=0; i<a1.length(); i++) { //printf("array %d: %d\n", i, a1.getData(i)); printf("array %d: %d\n", i, a1[i]); } Array a2 = a1; Array a3(20); a3 = a2; // 重載操作符= 功能二 for(int i=0; i<a2.length(); i++) { //printf("array %d: %d\n", i, a2.getData(i)); printf("array %d: %d\n", i, a2[i]); } a1[9] = 1000; if (a1==a2) // 重載操作符== 功能三 { cout << "兩個數組完全相等!" << endl; } else { cout << "兩個數組不相等!" << endl; } return 0;}ArrayText.cpp
重載操作符注意點:
1. 重載操作符有兩種方法:1> 用成員函數實現(大多數) 2> 用全域函數(友元函數)實現:當無法擷取到調用這個操作符的對象的源碼的時候,如:重載<<操作符
// 友元函數實現左移操作符,列印對象friend ostream &operator<<(ostream &out, Complex &cc);
2. 前置++(--)和後置++(--)注意點
//類成員函數實現前置++, 傳回值為自身的引用Complex &operator++()//類成員函數實現後置++, 傳回值為局部對象Complex operator++(int )
3. 特別注意:重載=或者是[]等操作符時,返回的是引用,只有引用可以當左值。還需注意的是,調用者的原本的指標域是否是空,不為空白則需釋放!
C++操作符重載