4.0 C++远征:重载运算符
重载运算符
四、重载运算符
概念
: 给原有运算符赋予新功能。
本质
: 函数重载。
关键字
: operator
1.一元运算符重载
符号只与一个操作数进行运算。
Ⅰ -(负号)的重载(取反啊)
-
友元函数重载
// Coordinate.hpp class Coordinate { friend Coordinate& operator-(Coordinate &coor); public: Coordinate(int x, int y); private: int m_iX; int m_iY; }; // Coordinate.cpp Coordinate& Coordinate::operator-(Coordinate &coor) { coor.m_iX = -coor.m_iX; coor.m_iY = -coor.m_iY; return *this; } // main.cpp int main() { Coordinate coor(3, 5); -coor; // operator-(coor); return 0; }
-
成员函数重载
// Coordinate.hpp class Coordinate { public: Coordinate(int x, int y); Coordinate& operator-(); // 有this指针 private: int m_iX; int m_iY; }; // Coordinate.cpp Coordinate& Coordinate::operator-() { m_iX = -m_iX; m_iY = -m_iY; return *this; } // main.cpp int main() { Coordinate coor(3, 5); -coor; // coor.operator-(); return 0; }
Ⅱ ++符号的重载
-
前置++符号重载
// Coordinate.hpp class Coordinate { public: Coordinate(int x, int y); Coordinate& operator++(); // 前置++ private: int m_iX; int m_iY; }; // Coordinate.cpp Coordinate& Coordinate::operator++() { m_iX++; m_iY++; return *this; } // main.cpp int main() { Coordinate coor(3, 5); ++coor; // coor.operator++(); return 0; }
-
后置++符号重载
// Coordinate.hpp class Coordinate { public: Coordinate(int x, int y); Coordinate operator++(int); // 后置++(int用来标识当前的++是后置重载,并不接受任何入参) private: int m_iX; int m_iY; }; // Coordinate.cpp Coordinate Coordinate::operator++(int) { Coordinate oldCoor(*this); m_iX++; m_iY++; return oldCoor; } // main.cpp int main() { Coordinate coor(3, 5); coor++; // coor.operator++(0); return 0; }
2.二元运算符重载
符号与两个个操作数进行运算。
Ⅰ +(加号)的重载
-
友元函数重载
// Coordinate.hpp class Coordinate { friend Coordinate operator+(const Coordinate &coor1, const Coordinate &coor2); public: Coordinate(int x, int y); private: int m_iX; int m_iY; }; // Coordinate.cpp Coordinate operator+(const Coordinate &coor1, const Coordinate &coor2) { Coordinate tempCoor; tempCoor.m_iX = coor1.m_iX + coor2.m_iX; tempCoor.m_iY = coor1.m_iY + coor2.m_iY; return tempCoor; } // main.cpp int main() { Coordinate coor1(3, 5); Coordinate coor2(4, 6); Coordinate coor3(0, 0); coor3 = coor1 + coor2; // coor3 = operator+(coor1, coor2); return 0; }
-
成员函数重载
// Coordinate.hpp class Coordinate { public: Coordinate(int x, int y); Coordinate operator+(const Coordinate &coor); private: int m_iX; int m_iY; }; // Coordinate.cpp Coordinate operator+(const Coordinate &coor) { Coordinate tempCoor; tempCoor.m_iX = this->m_iX + coor.m_iX; tempCoor.m_iY = this->m_iY + coor.m_iY; return tempCoor; } // main.cpp int main() { Coordinate coor1(3, 5); Coordinate coor2(4, 6); Coordinate coor3(0, 0); coor3 = coor1 + coor2; // coor3 = coor1.operator+(coor2); return 0; }
Ⅱ <<号的重载
-
友元函数重载
// Coordinate.hpp #include <ostream> using namespace std; class Coordinate { friend ostream &operator<<(ostream &output, const Coordinate &coor); public: Coordinate(int x, int y); private: int m_iX; int m_iY; }; // Coordinate.cpp ostream &operator<<(ostream &output, const Coordinate &coor) { output << coor.m_iX << ", " << coor.m_iY << endl; return output; } // main.cpp int main() { Coordinate coor(3, 5); cout << coor; // operator<<(cout, coor); return 0; }
-
输出运算符可以采用成员函数重载吗?
不可以。
因为重载输出运算符的第一个参数必须是ostream &out,而若写成成员函数必须是this指针。
Ⅲ [](索引)的重载
// Coordinate.hpp
class Coordinate {
public:
Coordinate(int x, int y);
int operator[](int index);
private:
int m_iX;
int m_iY;
};
// Coordinate.cpp
int operator[](int index) {
if(index == 0)
return m_iX;
if(index == 1)
return m_iY;
}
// main.cpp
int main() {
Coordinate coor(3, 5);
cout << coor[0]; // coor.operator[](0);
cout << coor[1]; // coor.operator[](1);
return 0;
}
-
索引运算符可以采用友元函数重载吗?
不可以。
因为索引运算符的第一个参数必须是this指针。