C++操作符重载
什么是重载:让操作符具有自己想要的功能。
#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); }; #endif
#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; }
#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; }
重载操作符注意点:
1. 重载操作符有两种方法:1> 用成员函数实现(大多数) 2> 用全局函数(友元函数)实现:当无法获取到调用这个操作符的对象的源码的时候,如:重载<<操作符
// 友元函数实现左移操作符,打印对象 friend ostream &operator<<(ostream &out, Complex &cc);
2. 前置++(--)和后置++(--)注意点
//类成员函数实现前置++, 返回值为自身的引用 Complex &operator++() //类成员函数实现后置++, 返回值为局部对象 Complex operator++(int )
3. 特别注意:重载=或者是[]等操作符时,返回的是引用,只有引用可以当左值。还需注意的是,调用者的原本的指针域是否是空,不为空则需释放!