《后台开发核心技术与应用实践》 第二章 读书笔记

《后台开发核心技术与应用实践》 第二章 读书笔记

第二章 面向对象的C++

  1. 类与对象

  2. 类,是创建对象的模板;对象,是类的实例。

  3. 类是抽象的,不占用存储空间;对象是具体的,占用存储空间。

  4. 类与结构体的区别:struct中的成员默认是public,而class中默认是private。在C语言里,struct不能定义成员函数,在C++中,增加了class类型后,扩展了struct的功能,struct中也能定义成员函数了。

  5. private的成员函数只能被本类中的其它成员函数使用,不能再类外被调用。成员函数中可以使用类中的任何成员,包括private和public.

  6. private:只限于类成员访问

  7. public:允许类成员和类外任何访问

  8. protect:允许类成员和派生类成员访问,不允许类外任何访问

  9. 参数初始化列表不再函数体内对数据成员初始化,在函数首部实现。

  10. 构造函数的重载

在这里插入图片描述

  1. 析构函数

    在函数中定义了一个对象,在函数调用结束后,对象会被释放,调用析构函数。

    static局部对象在函数调用结束时对象不释放,只有在main函数结束或调用exit函数结束程序时,才调用static局部对象的析构函数。

    全局对象在程序流程离开作用域时,执行析构函数。

    用new建立的对象,用delete释放对象时,会调用析构函数。

  2. 静态数据成员

    类的静态成员拥有一块单独的存储区,对象的静态数据成员都共享这一块静态存储空间。

    C++静态数据成员被类的所有对象所共享,包括该类的派生类的对象。派生类对象与基类对象共享基类的静态数据成员。改变它的值,各个对象中的这个数据成员的值同时都改变了。

    静态数据成员不随对象的建立而分配空间,也不随对象的撤销而释放,静态数据成员是程序在编译时被分配空间,到程序结束时释放空间。

  3. 静态成员函数

    静态成员函数是类的一部分,不是对象的一部分。

    当调用一个对象的成员函数时,系统会把该对象的其实地址赋给成员函数的this指针。静态成员函数与任何对象无关,没有this指针。无法对一个对象的非静态成员进行默认访问。静态成员函数与非静态成员函数的根本区别是:非静态成员函数有this指针,静态成员函数没有this指针。静态成员函数不能访问本类中的非静态成员。

  4. 对象的存储空间

    一个对象所占用的存储空间是非静态成员变量总和加上编译器为了CPU计算做出的数据对齐处理和支持虚函数所产生的负担总和。

    空对象中不包含任何信息,大小应该为0,但是声明该类型的对象时,必须在内存中占有一定的空间,否则无法使用,所以空对象的程序执行结果显示大小为1.

    静态数据成员不占对象的内存空间。

    成员函数、构造函数和析构函数都是不占空间的。

    在类中如果有虚的析构函数,那么编译器会为了支持虚函数,产生指向虚函数表的指针。

    在这里插入图片描述

    单一继承的空类空间也是1,多重继承的空类空间还是1,虚继承设计虚函数表和指向其的虚指针。

    函数代码是存储在对象空间之外的,函数代码段是公用的。

  5. this指针

    this指针是指向本类对象的指针,它的值是当前被调用的成员函数所在的对象的起始地址。

    this指针只能在成员函数中使用,在全局函数、静态成员函数中不能使用this。

    this指针在成员函数的开始前构造,在成员函数的结束后清除。

    this指针会因为编译器不同而又不同的存储位置,可能是栈,寄存器或全局变量。

    this是类的指针。

    普通的类函数,其中包括非静态成员函数和静态成员函数,不会创建一个函数表来保存函数指针,只有虚函数才会被放到函数表中。

  6. 类模板

  7. 析构函数与构造函数的执行顺序

    一般来说,调用析构函数的次序正好与调用构造函数的次序相反。

    全局范围中定义的对象的构造函数在文件中包括main函数的所有函数执行之前调用。当main函数执行完毕或者调用exit函数时,调用析构函数。

    局部自动对象,比如在函数中定义的对象,是在建立对象时调用构造函数,如果函数多次被调用,就在每次建立对象时调用构造函数,在函数调用结束,对象释放的时候调用析构函数。

    静态局部对象只在程序第一次调用此函数建立对象时调用构造函数一次,在调用结束时对象并不释放,只有在main结束或调用exit函数结束程序时,才调用析构函数。

继承与派生

  1. 继承与派生的一般形式

    继承方式包括公有继承、私有继承和保护继承,默认为私有继承

    派生类里面有两大部分内容:从基类继承而来的和声明在派生类时增加的部分。

  2. 派生类的访问属性

    基类的成员函数只能访问基类的成员,不能访问派生类的成员。

    派生类的成员函数可以访问基类的成员,派生类的成员函数也可以访问派生类成员。

    公有继承:基类的公用成员和保护成员在派生类中保持原有的访问属性,其私有成员仍为基类私有。

    私有继承:基类的公有成员和保护继承在派生类中成了私有成员,其私有成员仍为基类私有。

    保护继承:积累的公有成员和保护成员在派生类中成了保护成员,其私有成员仍为基类私有。保护成员是不能被外界引用,但可以被派生类成员引用。

    无论哪一种继承方式,派生类中不能访问基类的私有成员,私有成员只能被本类的成员函数访问。

  3. 派生类的构造函数与析构函数

    对基类成员和子对象成员的初始化必须在成员初始化列标中进行。

    先调用基类构造函数,再调用子对象的构造函数,最后调用派生类的构造函数。

    在派生时,派生类是不能继承基类的析构函数的,需要通过派生类的析构函数去调用基类的析构函数。

  4. 派生类的构造函数与析构函数的调用顺序

    如果有多个基类,构造函数的调用顺序是某类在类派生表中出现的顺序,不是它们在成员初始化表中的顺序。

    析构函数调用时机:

    对象生命周期结束被销毁时(一般类成员的指针变量与引用都不调用析构函数)。

    delete指向对象的指针时,或delete指向对象的基类类型指针,而基类的虚构函数是虚函数时。

    对象i是对象o的成员,o的析构函数被调用时,对象i的析构函数也被调用。

类的多态

  1. 多态

    多态性是指具有不同功能的函数可以用同一个函数名,可以用一个函数名调用不同内容的函数。

    同名覆盖与函数重载。

    虚函数的作用是允许在派生类中重新定义与基类同名的函数,可以通过基类指针或引用来访问基类和派生类中的同名函数。

在这里插入图片描述

  1. 虚函数的使用

    使用虚函数时,系统有一定的空间开销,当一个类带有虚函数时,编译系统会为该类构造一个虚函数表,是一个指针数组,用于存放每个虚函数的入口地址。

    虚函数是多态的基础,C++中没有虚函数就无法实现多态,不声明为虚函数就不能实现“动态联编”。

  2. 纯虚函数

    含有纯虚函数的类是抽象类,不能生成对象。

    子类中一定要实现纯虚函数的定义,不然编译会出错。

  3. 析构函数

    构造函数不能声明为虚函数,因为编译器在构造对象时,必须知道确切类型,才能正确的生成对象。在构造函数执行之前,对象并不存在,无法使用指向此对象的指针来调用构造函数。

    析构函数一般要声明成虚函数,当派生类对象经由一个基类指针被删除,而该基类指针带有一个非虚析构函数,那么派生类对象的成分没被删除,只进行了局部删除工作,从而造成内存泄漏。

在这里插入图片描述

  1. 单例模式

    单例模式的作用就是保证在整个应用程序的生命周期中的任何一个时刻,单例类的实例都只存在一个或者不存在。

    单例模式通过类本身来管理其唯一实例,唯一实例是类的一个普通对象,设计这个类时,让它只能创建一个实例并提供对此实例的全局访问。

    单例类的特征:1、有唯一指向实例的静态指针,并且是私有的。2、有一个公有的函数,可以获取这个唯一的实例,并且在需要的时候创建该实例。3、其构造函数是私有的,这样就不能从别处创建该类的实例。

发布了28 篇原创文章 · 获赞 34 · 访问量 2681

猜你喜欢

转载自blog.csdn.net/weixin_44289697/article/details/104360840