- virtual关键字的作用:virtual主要是实现动态绑定。C++中函数的调用默认不使用动态绑定。要触发动态绑定,必须满足两个条件:第一,将类成员函数指定为虚函数;第二,通过基类类型的引用或指针调用。
-
友元函数、构造函数(因为必须要构造函数调用完成后才会形成虚表指针)、static静态函数、普通函数(非类成员函数)不能用virtual关键字修饰; 普通成员函数 和析构函数 可以用virtual关键字修饰;
- 静态多态:函数重载、运算符重载; 动态多态:虚函数。
- 虚析构函数:解决基类指针指向派生类对象,并用基类的指针删除派生类对象。
- 纯虚函数:包含纯虚函数的类是抽象基类。纯虚函数的具体实现留给基类的派生类去做,且该类不能直接生成对象,而只有被继承,并重写其虚函数后才能使用。
- 虚函数的实现机制:
- new与malloc的区别
- 显示类型转换:
- static_cast关键字(编译时类型检查):用于基本数据类型之间的转换;如在把int转换为char时,如果char没有足够的比特位来存放int的值(int>127或int<-127时),那么static_cast所做的只是简单的截断,及简单地把int的低8位复制到char的8位中,并直接抛弃高位。 也可用于类层次结构中父类和子类之间指针和引用的转换。
- dynamic_cast关键字(运行时类型检查),依赖于RTTI(运行时类型信息)信息,只适用于指针或引用。
- violate关键字
- 重载:指在一个类中定义多个同名的方法,每个方法具有不同的参数类型或参数个数,完成的任务相似;
- 重写:子类对父类中的方法进行重写,实现不同的功能。
- 为什么引入非线性激活函数:如果不使用非线性激活函数,那么每一层的输出与输入呈线性相关,这种情况无论中间有多少隐藏层都与没有隐藏层效果相当。固引入非线性函数作为激励函数,这样深层神经网络就有意义了。
- Relu的优点:a、采用sigmoid函数做激活函数,反向传播求误差梯度时,求导涉及除法,计算量相对大,而采用Relu激活函数,整个过程的计算量节省很多。b、对于深层网络,sigmoid函数反向传播时,很容易就会出现梯度消失的情况,从而无法完成深层网络的训练。c、Relu会使一部分神经元的输出为0,这样就造成了网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生。
- C++中通过纯虚函数实现抽象类;抽象类只能被继承不能创建对象,子类必须实现纯虚函数的具体功能;类中只存在纯虚函数的时候成为接口,接口是一种特殊的抽象类。
- 内存管理单元的作用:
- 指令流水线:为提高处理器执行指令的效率,把一条指令的操作分成多个细小的步骤,取指令、译码、执行。
- lambda表达式:
- 内存溢出:是指程序在申请内存时,没有足够的内存空间供其使用; 内存泄漏:是指程序运行完后没有完全释放已申请的内存空间,占用有用内存,内存泄漏最终会导致内存溢出;内存越界:是指向系统申请一块内存后,使用时却超出申请范围。
- C++中利用OpenCV保存图片的数据结构:cv::Mat imwrite("路径名",Mat mat); IpIImage指针 cvSaveImage(); Mat数据类型:
成员变量:
int cv::Mat::cols; //返回矩阵的列数
int cv::Mat::rows; //返回矩阵的行数
uchar* cv::Mat::data; //指向矩阵数据单元的指针
int cv::Mat::dims; //返回矩阵的维度,该维度大于等于2
MatSize cv::Mat::size; //返回矩阵大小
成员方法:
获取图片高度:mat_name.cols;
获取图片宽度:mat_name.rows;
获取图片深度:mat_name.depth();
获取图片通道数:mat_name.channels();
获取存储的矩阵元素的数据类型:mat_name.type()
- 析构函数的作用:对象消亡时,自动被调用,用来释放对象占用的空间。
- C++访问权限和继承权限:
访问权限 public protected private 对本类 可见 可见 可见 对子类 可见 可见 不可见 对外部(调用方) 可见 不可见 不可见
- C++访问权限和继承权限:
- 判断链表有环:创建两个指针1和2,同时指向这个链表的头节点。然后开始一个大循环,在循环体中,让指针1每次向下移动一个节点,让指针2每次向下移动两个节点,然后比较两个指针指向的节点是否相同。如果相同,则判断链表有环;如果不同,则继续下一次循环。时间复杂度为O(N),空间复杂度为O(1)。