定義
運(yùn)算符重載的 實(shí)質(zhì) 是 函數(shù)的重載
- 使用意義
- 賦予操作符更多的意義悔雹,同一個(gè)運(yùn)算符伊佃,對(duì)不同類型的操作數(shù)掂骏,所發(fā)生的行為不同是
- 程序更加簡(jiǎn)潔
- 寫法格式:返回值 operator運(yùn)算符(參數(shù)列表){}
- 重載的要求:
- 1绩蜻、內(nèi)置類型的操作符不能被重載
- 2絮识、不能為內(nèi)置類型定義其他的操作符
- 3绿聘、操作符重載不能改變操作符的優(yōu)先級(jí)
- 4、操作數(shù)個(gè)數(shù)不能改變
- 重載方式:
- 1次舌、類的成員方法
- 2熄攘、類的有友元方法
- 3、全局方法
注意:
- ++a和a++的重載區(qū)別彼念。a++的重載方法中多一個(gè)占位參數(shù)
- 最好不好重載&&和||挪圾。因?yàn)闊o(wú)法實(shí)現(xiàn)短路功能。
- =, ->, [], ()不可以是全局域中的重載
-
>>
和<<
的從在需要使用友元方法或重載方法逐沙。因?yàn)榈谝粋€(gè)操作類是ostream或istream哲思。而我們無(wú)法在ostream和istream中定義重載方法,所以只能使用類的友元方法或全局方法來(lái)重載
示例
- Array.h
//
// Created by eric on 2017/8/14.
//
#ifndef CHONGZAI_ARRAY_H
#define CHONGZAI_ARRAY_H
#include "iostream"
using namespace std;
class Array {
private:
int mLength;
int *data;
friend Array operator+(Array &array1, Array &array2);
friend ostream &operator<<(ostream &out, Array &array);
friend istream &operator>>(istream &in, Array &array);
public:
Array(int len = 0);
Array(const Array &array);
Array(const int *arr);
void setData(int index, int data);
int getData(int index);
int &operator[](int index);
void operator=(Array &array);
Array &operator()(Array &array);
void print();
~Array();
int getMLength() const;
void setMLength(int mLength);
int *getData() const;
void setData(int *data);
};
#endif //CHONGZAI_ARRAY_H
- Array.cpp
//
// Created by eric on 2017/8/14.
//
#include "Array.h"
#include <iostream>
using namespace std;
Array::Array(const int *arr) {
}
void Array::setData(int index, int data) {
this->data[index] = data;
}
int &Array::operator[](int index) {
return data[index];
}
Array::Array(int len) {
mLength = len;
data = new int[mLength];
}
Array::Array(const Array &array) {
cout << "copy construct func" << endl;
if (mLength > 0 && data != NULL) {
delete[]data;
}
mLength = array.getMLength();
data = new int[mLength];
for (int i = 0; i < mLength; i++) {
data[i] = array.getData()[i];
}
}
int Array::getMLength() const {
return mLength;
}
void Array::setMLength(int mLength) {
Array::mLength = mLength;
}
int *Array::getData() const {
return data;
}
void Array::setData(int *data) {
Array::data = data;
}
Array::~Array() {
if (data != NULL) {
delete[]data;
}
}
void Array::operator=(Array &array) {
cout << "operator=" << endl;
if (mLength > 0 && data != NULL) {
delete[]data;
}
mLength = array.getMLength();
data = new int[mLength];
for (int i = 0; i < mLength; i++) {
data[i] = array.getData()[i];
}
}
void Array::print() {
for (int i = 0; i < mLength; i++) {
cout << data[i] << " ";
}
cout << endl;
}
Array &Array::operator()(Array &array) {
if (mLength >= array.getMLength()) {
return *this;
} else {
return array;
}
}
Array operator+(Array &array1, Array &array2) {
cout << "operator+" << endl;
int len = array1.mLength + array2.mLength;
Array array(len);
for (int i = 0; i < array1.mLength; i++) {
array.setData(i, array1.getData(i));
}
for (int i = 0; i < array2.mLength; i++) {
array.setData(array1.getMLength() + i, array2.getData(i));
}
// return array;
array.print();
array1.print();
array2.print();
return array;
}
int Array::getData(int index) {
return data[index];
}
ostream &operator<<(ostream &out, Array &array) {
cout << "operator<<" << endl;
for (int i = 0; i < array.getMLength(); i++) {
cout << array.getData(i) << " ";
}
cout << endl;
return out;
}
istream &operator>>(istream &in, Array &array) {
cout << "&operator>>" << endl;
for (int i = 0; i < array.mLength; i++) {
in >> array[i];
}
return in;
}
- main.cpp
#include <iostream>
#include "Array.h"
using namespace std;
int main() {
Array array(3);
for (int i = 0; i < array.getMLength(); i++) {
array[i] = i * 10;
}
array.print();
Array array1 = array;
array1.print();
Array array2(0);
array2 = array;
array2.print();
Array array3(2);
Array array4 = array3(array);
array4.print();
Array array5 = array + array1;
cout << array5;
Array array6(5);
cin >> array6;
cout << array6;
return 0;
}
- 運(yùn)行結(jié)果
0 10 20
copy construct func
0 10 20
operator=
0 10 20
copy construct func
0 10 20
operator+
0 10 20 0 10 20
0 10 20
0 10 20
operator<<
0 10 20 0 10 20
&operator>>
1
1
2
2
3
3
4
4
5
5
operator<<
1 2 3 4 5
Process finished with exit code 0