/* 运算符重载
* 概念:对已有的运算符进行重新定义,赋予其另一种功能,以适应不同的数据类型.
*
* 加号运算符(operator+)重载,有两种方式:
* (1)全局函数进行运算符重载;
* (2)类函数进行运算符重载;
*
* 左移运算符(<<, 也即 ostream)重载
* - 左移运算符重载一般采用全局函数的形式,因为若采用类函数,则调用形式变成了 class.cout,也即class << cout, cout到了右边了;
* - 配合友元可以访问类的私有成员;
* - 重载函数:ostream & operator<<(ostream & cout, Person & p){...; return cout} // 注意这里一定要返回
*
* 递增运算符(operator++)重载
* (1) 前置递增运算符重载
* - 为保持一致是对同一个对象进行重载,需要返回引用;
* - 前置运算符重载时没有参数;
* - 语法:Person& operator++(){this->age++; return *this}
*
* (2) 后置运算符重载
* - 后置递增返回的是值,可通过下面的代码进行理解,若返回局部变量temp,局部变量temp在函数运行后就会被回收释放,会引发报错,因此返回值;
* - 后置递增运算符重载时有一个占位符参数,以区别前置递增运算符;
* - 语法:Person& operator++(int){
* Person temp = *this->age; // 记录当前值
* this->age++; // 执行递增操作
* return temp; // 返回当前值(未执行递增操作)
* }
* 注:前置递增返回引用,后置递增返回值。
*
*
* 赋值运算符(operator=)重载:
* 类对象赋值运算符进行重载时,需要注意深拷贝浅拷贝问题(即堆中变量的释放):
* Person& operator=(Person &p){
* // 先判断是否有属性在堆区,若有则先释放干净再进行深拷贝
* if (this->m_age != NULL){
* delete this->age;
* this->age = NULL;
* }
* // 深拷贝
* this->age = new int(p.age);
* return *this;
* }
*
*
* 关系运算符(operator==, operator!=)重载
*
*
* 函数调用运算符(operator())重载
* (1)由于重载后使用的方式非常像函数的调用,因此称为仿函数;
* (2)仿函数没有固定写法,非常灵活。
* 栗子:class myPrint{
* void operator()(string test){
* cout << test << endl;
* }
* }
*/
栗子:
//
// Created by shexuan on 2021/1/5.
//
#include <iostream>
#include <string>
using namespace std;
class Person{
public:
Person(){
cout << "构造函数无参初始化" << endl;
}
Person(int age, int height): m_age(age), m_height(height){
cout << "构造函数列表初始化" << endl;
}
// 相当于 +=
// Person &operator+(Person &p){
// this->m_age = this->m_age + p.m_age;
// this->m_height = this->m_height + p.m_height;
// return *this;
// }
// 正常写法
Person operator+(Person &p){
Person temp;
temp.m_age = this->m_age + p.m_age;
temp.m_height = this->m_height + p.m_height;
return temp;
}
int m_age;
int m_height;
};
void test1(){
Person p1(19, 180);
Person p2(10, 110);
Person p3 = p1 + p2;
cout << "p1.age: " << p1.m_age << " p1.height: " << p1.m_height << endl;
cout << "p3.age: " << p3.m_age << " p3.height: " << p3.m_height << endl;
cout << "p1地址:" << &p1 << endl;
cout << "p3地址:" << &p3 << endl;
}
int main(){
// test1();
for (int i=0; i<10; ++i){
cout << i << endl;
}
}