类声明
1 2 3 4 5 6 7 8 9 10 11 12 13
| class Integer { friend std::ostream& operator<<(std::ostream&,const Integer&); private: int m_Data; public: Integer(): m_Data(0); Integer operator+(const Integer&); Integer& operator++(); Integer operator++(int); Integer& operator=(const Integer&); bool operator==(const Integer&); void operator()(const char*); };
|
加号+运算符重载
1 2 3 4 5 6 7 8 9 10 11 12
| Integer operator+(const Integer& i1, const Integer& i2) { Integer tmp; tmp.m_Data = i1.m_Data + i2.m_Data; return tmp; }
Integer Integer::operator+(const Integer& other) { Integer tmp; tmp.m_Data = this->m_Data + other.m_Data; return tmp; }
|
左移输出<<运算符重载
1 2 3 4 5
| std::ostream& operator<<(std::ostream& ostream,const Integer& integer) { ostream << integer.m_Data; return ostream; }
|
前置++递增运算符重载
1 2 3 4
| Integer& Integer::operator++() { m_Data++; return *this; }
|
后置++递增运算符重载
1 2 3 4 5
| Integer Integer::operator++(int) { Integer tmp = *this; m_Data++; return tmp; }
|
赋值=运算符重载
1 2 3 4 5 6 7 8 9
| Integer& Integer::operator=(const Integer& other) { if (m_Data != nullptr) { delete m_Data; m_Data = nullptr; } m_Data = new int(*other.m_Data); return *this; }
|
关系运算符重载
1 2 3 4
| bool Integer::operator==(const Integer& other) { bool res = this->m_Data == other.m_Data ? true : false; return res; }
|
函数调用运算符重载
1 2 3 4
| void Integer::operator()(const char* str) { std::cout << str << std::endl; }
|
赋值(=)、下标([])、函数调用(())和成员访问箭头(->)运算符必须是类内成员函数。
像这些操作数明显有左右固定顺序的操作符,比如下标运算符左边必须是数组对象,里面必须是整型,像这样:Array[5]。如果允许定义全局的运算符重载,那么程序员可以这样定义:void operator[](int x, Array array),那么这个函数可以这样子调用6[a],就非常的诡异。因此直接禁止掉全局的定义方式,只允许类内运算符重载,使得自定义对象类型固定在运算符的左侧。