C++面试

做~自己de王妃 提交于 2019-12-11 08:51:01
  1. virtual关键字的作用:virtual主要是实现动态绑定。C++中函数的调用默认不使用动态绑定。要触发动态绑定,必须满足两个条件:第一,将类成员函数指定为虚函数;第二,通过基类类型的引用或指针调用。
  2. 友元函数、构造函数(因为必须要构造函数调用完成后才会形成虚表指针)、static静态函数、普通函数(非类成员函数)不能用virtual关键字修饰; 普通成员函数 和析构函数 可以用virtual关键字修饰;

  3. 静态多态:函数重载、运算符重载; 动态多态:虚函数。
  4. 虚析构函数:解决基类指针指向派生类对象,并用基类的指针删除派生类对象。
  5. 纯虚函数:包含纯虚函数的类是抽象基类。纯虚函数的具体实现留给基类的派生类去做,且该类不能直接生成对象,而只有被继承,并重写其虚函数后才能使用。
  6. 虚函数的实现机制:
  7. new与malloc的区别
  • 显示类型转换:
  1. static_cast关键字(编译时类型检查):用于基本数据类型之间的转换;如在把int转换为char时,如果char没有足够的比特位来存放int的值(int>127或int<-127时),那么static_cast所做的只是简单的截断,及简单地把int的低8位复制到char的8位中,并直接抛弃高位。 也可用于类层次结构中父类和子类之间指针和引用的转换。
  2. dynamic_cast关键字(运行时类型检查),依赖于RTTI(运行时类型信息)信息,只适用于指针或引用。
  • violate关键字
  • 重载:指在一个类中定义多个同名的方法,每个方法具有不同的参数类型或参数个数,完成的任务相似;
  • 重写:子类对父类中的方法进行重写,实现不同的功能。
  1. 为什么引入非线性激活函数:如果不使用非线性激活函数,那么每一层的输出与输入呈线性相关,这种情况无论中间有多少隐藏层都与没有隐藏层效果相当。固引入非线性函数作为激励函数,这样深层神经网络就有意义了。
  2. Relu的优点:a、采用sigmoid函数做激活函数,反向传播求误差梯度时,求导涉及除法,计算量相对大,而采用Relu激活函数,整个过程的计算量节省很多。b、对于深层网络,sigmoid函数反向传播时,很容易就会出现梯度消失的情况,从而无法完成深层网络的训练。c、Relu会使一部分神经元的输出为0,这样就造成了网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生。
  3. C++中通过纯虚函数实现抽象类;抽象类只能被继承不能创建对象,子类必须实现纯虚函数的具体功能;类中只存在纯虚函数的时候成为接口,接口是一种特殊的抽象类。
  4. 内存管理单元的作用:
  5. 指令流水线:为提高处理器执行指令的效率,把一条指令的操作分成多个细小的步骤,取指令、译码、执行。
  6. lambda表达式:
  7. 内存溢出:是指程序在申请内存时,没有足够的内存空间供其使用; 内存泄漏:是指程序运行完后没有完全释放已申请的内存空间,占用有用内存,内存泄漏最终会导致内存溢出;内存越界:是指向系统申请一块内存后,使用时却超出申请范围。
  8. 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()

  9. 析构函数的作用:对象消亡时,自动被调用,用来释放对象占用的空间。
    1. C++访问权限和继承权限:
      访问权限 public protected private
      对本类 可见 可见 可见
      对子类 可见 可见 不可见
      对外部(调用方) 可见 不可见 不可见

这里写图片描述

  • 判断链表有环:创建两个指针1和2,同时指向这个链表的头节点。然后开始一个大循环,在循环体中,让指针1每次向下移动一个节点,让指针2每次向下移动两个节点,然后比较两个指针指向的节点是否相同。如果相同,则判断链表有环;如果不同,则继续下一次循环。时间复杂度为O(N),空间复杂度为O(1)。

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!