【c++基础】笔记(六)

来源:互联网 发布:问道mac版 编辑:程序博客网 时间:2024/06/03 17:33

1 关系运算符重载

1.1 对于自定义数据类型 ,编译器不知道如果去做对比

1.2 这时候需要重载  关系运算符

1.2.1 ==  

1.2.2 =

函数调用运算符重载  ()

2.1 重载() 使用时候很像函数调用,也称为仿函数

2.2 匿名函数对象 创建 MyAdd()

2.3 匿名函数对象调用()   MyAdd()(1,1)

强化训练 – 字符串类的封装

3.1 MyString字符串类

3.2 属性

3.2.1 char * pString 指向堆区的空间

3.2.2 int m_Size 字符串长度

3.3 行为

3.3.1 有参构造

3.3.2 拷贝构造

3.3.3 析构

3.4 重载 <<

3.5 重载 >>

3.6 重载 =  防止深浅拷贝

3.7 重载[] 通过索引获取和设置值

3.8 重载 +  进行字符串拼接  strcat

3.9 重载 == 关系对比

继承

4.1 解决问题 就是代码重复

4.2 抽象出公共的部分 作为基类中的内容

4.3 而派生类 只提供自己的内容

4.4 语法  class 派生类(子类)  : public  基类(父类)

5 继承方式

5.1 公共继承 public

5.1.1 父类中的public 到子类中依然是 public

5.1.2 父类中的protected 到子类中依然是 protected

5.1.3 父类中的private无法访问

5.2 保护继承 protected

5.2.1 父类中的public 到子类中是 protected

5.2.2 父类中的protected到子类中是protected

5.2.3 父类中的private无法访问

5.3 私有继承  private

5.3.1 父类中的public 到子类中是 private

5.3.2 父类中的protected到子类中是private

5.3.3 父类中的private无法访问

6 继承中的对象模型

6.1 子类会继承父类中的所有内容 ,即使是私有的也被继承下来了,只是编译器给隐藏了

6.2 利用工具查看 对象模型

6.3 C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools\Shortcuts

6.4 cd 到 文件目录下

6.5 cl /d1 reportSingleClassLayout类名 文件名.cpp

7 继承中的构造和析构顺序

7.1 创建子类对象时候会调用父类的构造

7.2 先父类的构造  然后调用子类的构造  析构顺序是相反的

7.3 如果父类中没有默认构造函数,可以通过初始化列表方式显示调用父类的有参构造

8 继承中的同名成员处理

8.1 当子类和父类中有同名成员时候,子类中的同名优先使用

8.2 如果想用父类  加上作用域

8.3 当提供了同名函数 ,编译器会将父类中所有版本的同名函数隐藏掉,需要显示的告诉编译器调用哪个版本

9 继承中静态成员的处理

9.1 结论 :继承中静态的成员与非静态成员访问模式一样

10 多继承语法

10.1 使用方式  class 子类:public 父类1  ,  public父类2

10.2 尽量不使用多继承,因为无法保证父类1和父类2中名称都不相同

10.3 如果出现相同的名称,需要加上作用域来区分

11 菱形继承问题以及解决方案

11.1 多继承会引发二义性,二义性可以通过作用域解决

11.2 多继承还会带来数据重复问题,导致内存浪费

11.3 解决方案 利用虚基类

11.4 在基类里 加入virtual,可以变为虚基类

11.5 内部会变为  vbptr

11.5.1 虚基类指针

11.5.2 virtual  base  pointer

11.5.3 vbtable  虚基类表

11.6 最后所有的访问方式都共享同一份数据

12 虚基类指针工作原理

12.1 通过虚基类指针可以找到偏移量

13 

原创粉丝点击