1. 基础概念ios
重载的运算符是具备特殊名字的函数:(重载运算符函数,运算符函数。重载运算符)函数
依次包含返回类型,函数名(operator=),参数列表,函数体。this
只有重载的函数调用运算符operator()才能有默认实参。spa
关于参数的数量,通常来讲,一元运算符有一个参数,二元有两个,三元有三个;指针
可是若是该运算符函数是成员函数,则其中一个运算对象将是本类对象,第一个参数隐式绑定到this常量指针上,不显示在参数列表中。成员运算符函数的参数数量比运算符对象少一个。code
HasPtr& operator=(const HasPtr& right){ mString = right.mString; return *this; }
运算符函数要么是一个类类型的成员函数,要么它必有类类型的参数。这是由于不能重载内置类型之间的运算(能够重载类类型与类类型之间的运算,类类型和内置类型之间的运算)。对象
不能本身发明运算符,不能改变运算符的优先级,也不能改变运算符原始运算对象的个数,例如&运算符能够用于一元运算,也能够用于二元运算,则根据参数数量判断是一元仍是二元,可是!操做符永远不可能重载为二元运算符。blog
2. 一个例子string
能够先看一个简单的例子,重载了类类型Data的 "+" 二元运算符,该运算符函数不是成员函数,所以,参数为两个类类型,返回的是类类型中string成员的拼接版(中间加入--)io
#include <iostream> #include <string> using namespace std; class Data{ public: Data(){} Data(string str){ this->str = str; } string str; }; string operator+(const Data& data1, const Data& data2){ string str = data1.str + " -- " + data2.str; return str; } int main(){ Data data1("hello"), data2("slam"), data3("!!!"); cout << data1+data2+data3 << endl; }
输出:
hello -- slam -- !!!
若但愿将操做符函数定义为Data类的成员函数,则须要改动以下:
#include <iostream> #include <string> using namespace std; class Data{ public: Data(){} Data(string str){ this->str = str; } string str; Data operator+(const Data& data); }; // 只有将返回值定义为Data类型,表达式才能使用连续运算的形式data1+data2+data3 Data Data::operator+(const Data& data){ str = str + " -- " + data.str; return *this; } int main(){ Data data1("hello"), data2("slam"), data3("!!!"); cout << (data1+data2+data3).str << endl; }
输出结果相同。
注意在第一个例子中(非成员函数)
data1+data2 等价于 operator+(data1, data2)
第二个例子中(成员函数调用)
data1+data2 等价于 data1.operator+(data2)
3. 经常使用重载运算符
1) 输入输出运算符 << >>
2) 算数和关系运算符 == != <
3) 赋值运算符 =
4) 下标运算符 []
5) 递增和递减运算符 ++ --
6) 成员访问运算符 * ->
7) 函数调用运算符 ()