91.RAII(获取资源时才初始化,一种资源管理方式)本身为栈对象
92.智能指针,一共有4种auto_ptr(只能生成栈对象),unique_ptr,shared_ptr(强引用指针),weak_ptr(弱引用指针)。头文件为#include<memory>,使用只能指针主要是为了防止内存泄露,传统的内存分配方式如果忘记回收内存,会造成内存泄漏。智能指针过期后,会自动调用析构函数delete回收内存
93.对一个对象所有权的转移发生在复制或赋值的时候
94.查看shared_ptr的引用计数,用use_count()函数,shared_ptr指向堆空间,但如果指向的多个对象本身还相互指向,存在指针,变成一个循环,即使shared——ptr退出后,由于引用计数不为0,空间不会被释放。解决上面问题,用weak_ptr,weak_ptr不是用引用计数
95.通过lock函数把weak_ptr提升为shared_ptr
96.左值是指表达式结束后依然存在的持久对象,右值是值表达式结束时就不存在的临时对象(能对表达式取地址,即为左值,否则是右值)
97.右值引用是两个引用符号,int &&a = 10(10不是常量,为字面值),右值引用的使用主要关于移动语义,简单的说,就是,值的存放的内存不变,而变量与该内存相关联,不需要删除临时对象。(类似于计算机的文件移动,即只改变了记录)
98.在即有类的基础上定义新的类,而不是将即有类的内容重新书写一遍,这种称为继承,即有类称为父类或者基类,在它基础上建立的类成为派生类或者子类和导出类。格式为:class 子类名 : 继承方式(pubilc, private,protected) 父类名。子类在内存中布局的时候,首先会吸收父类的成员。当子类的函数跟父类函数相等时,子类函数会隐藏父类函数。(与基类和派生类的访问属性无关;与基类和派生类的函数间的参数和返回类型无关)没有写继承方式,默认为private
99.子类继承不了父类的构造函数,析构函数,用户重载的new,delete运算符,用户重载的=运算符,友元关系
100.不管是什么继承方式,子类都不能访问父类的私有成员。子类内部除了父类的私有成员外,其他的都能访问。车了公有继承基类中的公有成员,子类对象可以访问外,其他的子类对象一律不能访问
101.多重继承,class 子类名 : 继承方式1(pubilc, private,protected) 父类名1,继承方式2(pubilc, private,protected) 父类名2,规则与普通继承相同,但是一般不推荐使用,维护成本太高
102.对于多重继承,如果有相同函数名,要调用函数,要加上类作用域,如c.A::print() c.B::print()(消除二义性)
103.由于构造函数和析构函数不能继承,为了对父类成员进行初始化,必须对子类重新定义构造函数和析构函数,并在构造函数的初始化列表中调用基类的构造函数。创建一个子类后,要先对基类成员进行初始化,然后才能对子类中的新增成员进行初始化。
104.如果派生类有构造函数,而基类没有,则创建派生类的对象时,派生类相应的构造函数会被自动调用,此时都自动调用了基类缺省的无参构造函数。
105.如果派生类没有构造函数而基类有,则基类必须拥有默认构造函数。
106.如果派生类有构造函数,基类有默认构造函数,则创建派生类的对象时,基类的默认构造函数会自动调用,如果你想调用基类的有参构造函数,必须要在派生类构造函数的初始化列表中显示调用基类的有参构造函数。
107.如果派生类和基类都有构造函数,但基类没有默认的无参构造函数,即基类的构造函数均带有参数,则派生类的每一个构造函数必须在其初始化列表中显示的去调用基类的某个带参的构造函数。如果派生类的初始化列表中没有显示调用则会出错,因为基类中没有默认的构造函数。
108.各基类构造函数的执行顺序与其在初始化表中的顺序无关,而是由定义派生类时指定的派生类顺序决定的。
109
.
“
类型适应”是指两种类型之间的关系,说
A
类适应
B
类是指
A
类的对象能直接用于
B
类对象所能应用的场合,从这种意义上讲,派生类适应于基类,派生类的对象适应于基类对象,派生类对象的指针和引用也适应于基类对象的指针和引用。
110.总而言之,构造一个子类对象的时候,每次都要在初始化列表里面显式的调用一个构造函数
111.在执行派生类析构函数时,基类析构函数会被自动调用。
112.隐藏(oversee):父子类,函数名称相同,不带virtual关键字函数。覆盖(override):父子类,函数名称,返回值类型,参数的类型个数都相同。重载(overload):同一个类,函数名称相同,参数不同(类型,顺序,个数)
113.基类与派生类之间的转换,可以通过引用,指针,强制转换的方式,将派生类转换为基类(只能将派生类转换为基类,但是基类不能转换为派生类,这样会编译通不过)
114.如果用户定义了派生类的拷贝构造函数或者重载了派生类的赋值运算符=,就不会再自动调用基类的拷贝构造函数和基类的重载对象赋值运算符,这时候就要显式调用
115.多态,即一个接口,多种方法(多态性是指同一个操作作用于不同的对象就会产生不同的响应)。多态分为两种形式,1.静态多态(函数重载和运算符重载)。2.动态多态(虚函数)
116.C++编译器根据传递给函数的参数和函数名决定具体要使用哪个函数,称为联编。当一个程序在编译完毕后,这种行为就固定了,称为静态联编。动态联编,即编译器无法在编译过程中完成联编,必须在程序运行完成选择,称为动态联编
117.为什么需要虚函数,如果不加virtual,具体调用哪个版本的函数,取决于指针本身的类型,与指针所指对象无关。加了virtual后,则反之
118.形成多态的条件:有继承关系并且派生类中对基类的virtual函数现实了覆盖,利用基类的引用或指针指向派生类对象,再用基类的对象去调用virtual函数的时候会实现多态
119.如果一个基类的函数定义为virtual,则它在派生类中也是虚函数。无论前面有没有virtual,如,父类中有virtual void disp() 子类中有 void disp(),这个也是虚函数
120.派生类中可以对虚函数进行重定义,但是必须有相同的参数类型,个数和返回类型