分类: [科锐]

33_抽象类多重继承

作业讲解 基类虚表是静态数据成员数组,基类里面存放函数,基类有一个数据成员虚表指针,基类析构的时候基类需要恢复虚表。派生类也有数据成员虚表指针,指向派生类的函数 抽象类 定义 一个类至少一个纯虚函数,这个类就是抽象类 抽象类调用抽象类会使程序退出。实验:可以抽象类指针指向派生类,先析构派生类,还原了虚函数指针,然后调用抽象类的虚函数 命名规范:抽象类用I开头,正常的类是C开头. 抽象类的虚函数->基类可以实现 纯析构函数,派生类必须实现析构 抽象类析构可以写成 virtual ~IAnimal() {}; //派生类会自动 ......

32_继承二与虚函数

继承权限 Class A : private B B里面的属性在A里面全部变成私有 Class A : protected B B里面的属性在A里面,public变成Protected,protected不变,private不变 Class A : public B A里面什么属性是什么B里面就是什么属性 运用场景 Claas A : private B,一般会选择想要公开的几个 函数 A::fun; 内存布局 A::member B::member 构造顺序 实例化对象的时候先构造基类,再构造子类,按继承顺序来构造基类 有对象成员的时候,先基类,再对象成员,再自己 析构顺序 先自己,在对象成员,在父类 父类指针指向子类对象 派生类指针转换 ......

31_继承

作用:解决类代码重用性 抽象:共同的属性抽象出来 关键字:类名 : 继承的父类,逗号分隔多个 子类也叫派生类,父类也叫基类 初始化列表,指定基类的构造函数 权限关键字 Protected,派生类继承了可以使用 重写基类的方法 1.作用,基类的方法被隐藏 2.使用,觉得基类的方法不能满足当前需求,写和基类一样的函数名,参数,重新实现 3.注意,继承的基类方法不构成重载,原因是作用域不一样 作业 1.以点类Point为基类,定义派生类三维点类,其中动物有属性x,y,三维点类新增加y属性, 编程实现属性和相关方法 //Point.h #pragma onc ......

27_构造函数与析构函数

面向对象编程的缺陷 数据成员是私有的,成员函数是共享的 类实例化对象调用函数的地址传入寄存器了,vs默认使用的__thiscall调用约定,标准没有 This指针本身取不了地址,调用约定不明确的原因 通过this指针修改其它的实例化对象借刀杀人 自己写的初始化函数外面可以多次调用,使用者不按约定套路来,破坏程序正常逻辑或造成内存泄漏 忘记调用初始化函数与忘记调用反初始化调用函数 面向对象过程当中一定会有初始化函数 构造函数 解决问题 初始化函数忘记调用 重复调用初始化函数 反初始化函数忘记调用 语法 没有返回值、可以 ......

30_友元和引用计数

作业讲解 1.只能产生一个对象(单例模式),构造私有了编译器报错。类里面私有提供一个静态对象,类里面公有静态方法产生一个对象,返回静态对象。解决了资源浪费 Class A { Public: Static A* getInstance() {        Return theObj; } Private:         A()         { } ~A { } Static A theObj; } A A::theObj; 2.只能在堆上产生对象,直接把析构设为私有,提供一个自杀函数 Class B { Public: B() {};  Void kill() {delete this}; Private: ~B() {}; } 3.只能在栈上创建对象 通过第一个控制创建的对象,自杀的方法,控制次数 ......

29_常成员初始化列表静态函数

常成员函数 常成员函数,在成员函数后面加上const 作用,防止自己修改数据成员 const修饰的指针对象不能调用成员函数,只能调用常成员函数 static_cast转换类型,有风险不让转 初始化列表 const修饰的数据成员在C11之前不能直接初始化 初始化列表,构造函数外面加冒号 成员对象(值),以逗号分隔。可以初始化const修饰的数据成员与指明成员对象的构造参数 初始化列表的顺序,不影响顺序 数据成员对象比初始化列表先初始化,按照定义顺序构造 先析构自己,再反顺序析构成员对象 静态数据成员 errrno接受错误 替代了C语言的全局 ......

28_拷贝构造与动态字符串

拷贝构造 先实例化先构造 把实例化的一个对象赋值的给另一个对象的时候相当于memcpy //造成重复释放与没有释放 和构造函数一样,不过参数是当前类对象的引用 数据成员有指针需要使用 语法 CLASS cs; CLASS cs2 = cs;      //拷贝构造 浅拷贝 直接拷贝所有相等的,会造成重复释放,VS默认拷贝构造为浅拷贝 深拷贝 堆空间重新申请,指向不一样的堆空间 动态字符串的封装 动态字符串(输入多大申请多大),能想到的字符串操作 拷贝 长度 拼接 大小写 子串(反向查找) 查找位置(库函数都是从左向右,可以方向查找) 比较 类型 ......

26_类

面向对象编程 面向对象编程思想,经验的提炼,找出会变化的代码 抽象:例如所有车都有的功能,根据现实中的经验去分类,可以无限扩展,结构体应该写什么数据,有什么函数 封装:限制对象的活动范围,get、set,通过函数来中转。能想到类的所有操作方式 为了保护封装性,C++类给出了权限划分 为了调用方便,不用每次调用函数 类 类的权限划分,public公有,private私有,protected受保护的 类里面分为两个东西 属性、数据成员、字段—》都是一个意思 函数成员、成员函数、方法—》都是一个意思 this表示使用传递进来的指针, ......

25_内联函数与函数重载

内联函数 1.关键字inline 2.函数:优点:空间小 缺点:效率低 拿时间换空间 宏:优点:效率高 缺点:空间占用大 拿空间换时间 带参宏传参的时候用”++”和”–”无法解决这个bug,C++用内联函数取代 3.效果:根据编译器觉得这个函数是函数最好还是宏最好 4.debug版本不会内联(为了调试),release才会内联 5.inline关键字一般写到函数实现中,函数实现简单才会被编译器内联 6.inline实现和声明要写一样 函数重载 来源于泛型(广泛)编程,主要解决类型问题 函数重载是多态的体现 调用的时候只要丢失精度或者类型不匹配可能构成二义性 ......

24_const,引用,缺省参数

作业 #include <limits.h> //数据类型最大有效位 float转double会丢失精度 cout.hex要单独使用,得到的是枚举值 语言改进宏成const 1. 宏的类型由表达式决定的,宏本身没有类型 2. 好用的宏应该是类型明确,又能被调试,不能被修改,C++出现了const 3. const常量不能直接获得地址,调试的时候可以从全局常量附近找地址,但修改了也没用。发布的时候没有这个地址。 4. 解决指针误操作问题,列如一个”=”修改 和 “==”判断,使用const修饰指针经常修饰函数的参数。但是还是可以强行取地址修改(破坏了语法) 5. *右边加const表示指 ......