后置递增:void operator(int) int代表占位参数,可以用于区分前置和后置递增类和对象-C++运算符重载-赋值运算符重载默认情况下,C++编译器至少给一个类添加三个函数
默认构造函数(无参,函数体为空);
默认析构函数(无参,函数体为空);
默认拷贝构造函数,对属性进行值拷贝;
赋值运算符 operator=,对属性进行值拷贝;总结:如果类中有属性指向堆区,做赋值操作时也会出现深浅拷贝问题类和对象-C++运算符重载-关系运算符重载作用:重载关系运算符,可以让两个自定义数据类型对象进行对比操作类和对象-C++运算符重载-函数调用运算符重载
函数调用运算符()也可以重载
由于重载后使用的方式非常像函数的调用,因此被称为仿函数
仿函数莫有固定写法,非常灵活//重载关系运算符 bool operator==(Person &p) { if (this->m_Name == p.m_Name&&this->m_Age == p.m_Age) { return true; } return false; }类和对象-继承-基本语法优点:减少重复代码类和对象-继承-继承方式语法:class 子类 :继承方式 父类继承的方式有三种:
公共继承
保护继承
私有继承
公共继承:父类的公共权限,在子类依然是公共权限 父类的保护权限,在子类依然是保护权限 父类的私有成员 子类访问不到保护继承:父类的公共权限,在子类变为保护权限父类的保护权限,在子类依然是保护权限父类的私有成员 子类访问不到私有继承:父类的公共权限,在子类变为私有权限父类的保护权限,在子类变为私有权限父类的私有成员 子类访问不到 类和对象-继承-继承中的对象模型
父类中所有非静态成员都会被子类继承下去
父类中的成员属性 是被编译器给隐藏了,因此是访问不到,但确实是被继承下去了类和对象-继承-构造和析构顺序
子类继承父类后,当创建子类对象,也会调用父类的构造函数
继承中的构造和虚构顺序如下:先构造父类,再构造子类,析构的顺序与构造的顺序相反类和对象-继承-同名成员处理问题:当子类与父类出现同名成员,如何通过子类对象,访问到子类或父类中同名的数据呢?
访问子类同名成员 直接访问即可
访问父类同名成员 需要加作用域
当子类与父类拥有同名的成员函数,子类会隐藏父类中同名成员函数,加作用域可以访问到父类中同名函数类和对象-继承-同名静态成员处理问题:继承中同名的静态成员在子类对象上如何进行访问?
通过对象访问
通过类名访问静态成员和非静态成员出现同名,处理方式一致
访问子类同名成员 直接访问即可
访问父类同名成员 需要加作用域
当子类与父类拥有同名的成员函数,子类会隐藏父类中同名成员函数,加作用域可以访问到父类中同名函数类和对象-继承-继承语法
C++允许一个类继承多个类
多继承可能会引发父类中有同名成员出现,需要加作用域区分
不建议使用多继承类和对象-继承-菱形继承问题以及解决方法菱形继承概念:
两个派生类继承同一个基类
又有某个类同时继承两个派生类
这种继承称为菱形继承或者钻石继承类和对象-多态-多态的基本语法多态分为两类:
静态多态 函数重载和运算符重载属于静态多态,复用函数名
动态多态 派生类和虚函数实现运行多态静态多态和动态多态的区别:
静态多态的函数地址早绑定 编译阶段确定函数地址
动态多态的函数地址晚绑定 运行阶段确定函数地址Speak就是虚函数函数前面加上virtual关键字,变成虚函数,那么编译器在编译时就不能确定函数调用了类和对象-多态-多态的原理剖析多态满足条件: 有继承关系 子类重写父类中的虚函数多态使用条件: 父类指针或引用指向子类对象重写:函数返回值类型 函数名 参数列表 完全一致称为重写类和对象-多态-纯虚函数和抽象类
在多态中,通常父类中虚函数的实现是毫无意义的,主要都是调用子类重写的内容
可以将虚函数改为纯虚函数
纯虚函数语法:virtual 返回值类型 函数名 (参数列表) = 0;
当类中有了纯虚函数,这个类也被称为抽象类;
抽象类特点:a. 无法实例化对象b. 子类必须重写抽象类中的纯虚函数,否则也属于抽象类类和对象-多态-虚析构和纯虚析构
多态使用时,如果子类有属性开辟到堆区,那么父类指针在释放时无法调用到子类的析构代码
解决方式:将父类中的析构函数改为虚析构或者纯虚析构
虚析构和纯虚析构共性a. 可以解决父类指针释放子类对象b. 都需要有具体的函数实现
虚析构和纯虚析构共性如果是纯虚析构,该类属于抽象类,无法实例化对象
虚析构语法:Virtual ~类名(){}
纯虚析构语法:Virtual ~类名()= 0;类名::类名(){}