- 概念 
- 对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型
 - 主要是重载函数的函数名就是operator,这是编译器起好的
 
  - 加号 
- 成员函数重载
 - 调用的本质Person p3 = p1.operator+(p2);
 
   class Person{public:Person operator+(Person &p){Person temp;temp.m_A = this->m_A + p.m_A;temp.m_B = this->m_B + p.m_Areturn temp;}}
 - 全局函数重载
 - 调用的本质Person p3 = operator+(p1, p2);
 
   Person operator+(Person &p1, Person &p2){Person temp;temp.m_A = p1.m_A + p2.m_A;temp.m_B = p1.m_B + p2.m_B;return temp;}
   - 左移—输出—可以输出自定义数据类型—需要配合友元 
- 成员函数—不可行—因为无法实现对象在右边这种情况 
- p.operator<<(cout)简化为p << cout
 
  - 只能利用全局函数重载 
- operator<<(cout, p) 简化 cout << p
 
  
   ostream& operator<<(ostream& cout, Person &p){cout << "m_A = " << p.m_A;return cout;}
 - 问题—如果是私有属性,这种全局函数无法访问怎么办—友元函数
 
  - 递增/递减运算符重载—存在前置递增和后置递增 
- 前置递增和后置递增的区分—采用占位参数
 - 前置递增返回的是引用,后置递增返回的是数值  
 
   class Num{friend ostream& operator<<(ostream& cout, Num n);private:int n_Num;public:Num(int a): n_Num(a) {return ;}Num& operator++(void){n_Num++;return *this;}Num operator++(int){Num temp = (n_Num);n_Num++;return temp;}   };ostream& operator<<(ostream& cout, Num& n){cout << n.n_Num << endl;return cout;}int main(){Num n(1);cout << n++ <<endl;cout << n << endl;cout << ++n << endl;return 0;}
  - 赋值运算符 
- 赋值运算=其实也是默认就有的—属性值拷贝
 - 编译器提供的赋值运算符的操作是一个浅拷贝的操作,因此在涉及到内存问题时候需要进行深拷贝,故而需要进行重载
 - = 有连续赋值行,因此,涉及到链式编程
 
   class Age{friend ostream& operator<<(ostream& cout, Age& n);private:int* m_age;public:Age(int age){m_age = new int(age);}Age(const Age& age){if(m_age != NULL){delete m_age;m_age = NULL;}m_age = new int(*age.m_age);}Age& operator=(Age &p){if(m_age != NULL){delete m_age;m_age = NULL;}m_age = new int(*p.m_age);return *this;}~Age(){if(m_age != NULL){delete m_age;m_age = NULL;}}};ostream& operator<<(ostream& cout, Age& n){cout << *n.m_age << endl;return cout;}int main(){Age a(10);Age b(20);Age c(30);cout << a << endl;cout << b << endl;cout << c << endl;a = b = c;cout << a << endl;return 0;}
  - 关系运算符  
  class Person{public:int m_age;string m_name;Person(string m_name, int m_age){this->m_name = m_name;this->m_age = m_age;}bool operator==(Person& p){if(this->m_age == p.m_age && this->m_name == p.m_name){return true;}return false;}bool operator!=(Person& p){if(this->m_age != p.m_age || this->m_name == p.m_name){return true;}return false;}};
  - 函数调用运算 
- ()也可以重载
 - 由于重载后使用的方式非常像函数的调用,因此称为访函数
 - 访函数没有固定写法,非常灵活
 
   class Myprintf{public:void operator()(string test){cout << test << endl;}}Myprintf printf;printf("hello cpp");
  - 匿名函数 
- 类型()
 - Myprintf()(“hello cpp”);