类和对象
1. struct和class在定义类时最重要的区别:
c++类通过class的private、protected和public实现访问访问控制。struct和class定义类的区别是:struct缺省(没有定义访问控制)的数据成员和成员函数是public类型的,而在class中缺省的数据成员和成员函数是private类型的。
2.构造函数:
1)没有定义构造函数,则会自动生成一个缺省的构造函数;如果定义了任意一个构造函数,则不会生成缺省构造函数。构造函数的访问类型可以是多种,一般由一个公开构造函数。
2)拷贝构造函数为单参数,用于构造已有对象的副本,为本类的常对象的应用。如果没有定义,则会自动生成一个缺省拷贝构造函数。缺省拷贝构造函数为浅拷贝,即只完成指针值得拷贝,无法完成指针指向数据对象的拷贝;成员为指针时,需要自行定义深拷贝。
3)构造函数初始化列表,目的和意义:构造对象时同步构造内部对象;部分成员(常量与引用)只能初始化,不能赋值;部分成员(类的某个数据成员是另一个类的对象)如果赋值,将导致两次构造(在分配内存时,调用缺省构造函数构造,然后执行构造函数体内的赋值语句再次构造,效率不佳;若类没有缺省构造函数,将会导致问题)。成员初始化时按照成员定义的顺序定义,而不是初始化列表顺序;必须保持初始化列表和成员定义的顺序一致,但允许跳过部分成员,否则后续成员可能不能正确初始化。
3.析构函数
1) 没有返回类型,无参数。析构函数必须是公开的,可以由系统自动调用,也可以由程序其他部分调用,但两者原理不同。若为定义,则会自动产生一个缺省析构函数。
2)析构函数用于释放对象中动态分配内存的目标数据对象,缺省析构函数只能完成浅存的释放,深存(包含指针)的释放必须自行定义析构函数,否则将导致内存泄露。
4.析构函数类的声明时可以缺省的函数:缺省构造函数,缺省拷贝构造函数,缺省析构函数,
5.内联函数
5常数据成员
6.常成员函数
7.静态数据成员
8. 静态成员函数
静态成员函数没有缺省的this指针。
9. 单例(单子)模式
只存在某类的单一共享对象;存在全局访问策略,以便在需要时进行访问。
用于频繁创建和销毁的类,节省资源。
判断系统是否已经有这个单例,如果有则返回,如果没有则创建。
特点是构造函数是私有的。
1)无析构模式
拷贝构造函数和析构函数都只声明而不实现,不能拷贝或是赋值构造,也不能析构。
2)错误析构情况:
非静态函数不能释放静态指针成员,否则可能导致系统崩溃,delete操作符本身需要调用本类的析构函数,在类的析构函数中调用析构函数是不正确的。
3)嵌套类析构
,
使用嵌套类来销毁,调用静态成员的析构函数销毁单例对象。但只能在程序结束时进行,有些编译器为了优化,在程序结束时会把所有资源直接返还给操作系统,所以单子模式的析构函数可能不会调用,写在析构函数中的代码不会执行,会产生预期之外的错误(无法做持久化操作)。
4)free() 函数析构
使用delete会调用析构函数清空内存,使用fr而ee()函数时只是简单的清空内存,而不需要调用析构函数,可以进行持久化操作。但是使用Get会再次创建一个单例对象,但销毁的对象和新创建的对象是不同的,但存在的时间是不同的,在内存中的地址可能不一样,但是保证了单例对象在程序中的唯一性。但是必须要调用release函数。
5)静态数据
不使用指针,不分配动态内存,定义静态的单例对象,返回静态局部变量,在程序运行期间维持不变,实质上是一种引用。
10. 静态常数据成员
11. 友元函数与友元类
友元不单向不可逆的,与访问控制权限无关。
12. 继承与派生
1)单继承
函数覆盖于二义性
2)多继承
函数覆盖和二义性:
3)虚基类、
在多继承下使用,单继承无需使用,virtual需要额外操作。
4)派生类的构造函数和析构函数
派生类的构造函数初始化列表里必须先调用基类的构造函数进行初始化。
5)类的赋值兼容性
13. 多态性
1)
指向基类的指针,会自动根据指向的对象类型自动调用对应的类函数,为每个对象维持一个虚函数表,记录函数入口地址。
2)纯虚函数
函数没有任何实现,初始化为0,本身不存在,不能调用,但在虚函数表中函数指针存在。析构函数一般为虚析构。