C++面试

本文探讨了C++中的virtual关键字及其在动态绑定中的作用,包括虚函数和虚析构函数。介绍了静态和动态多态,以及静态和动态类型转换。讨论了C++中的抽象类和纯虚函数。此外,还涉及了内存管理、指令流水线、lambda表达式、内存问题(溢出、泄漏和越界)以及链表有环的判断。最后,提到了C++的访问权限和继承权限,以及析构函数的重要性。
摘要由CSDN通过智能技术生成
  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++访问权限和继承权限:
      访问权限publicprotectedprivate
      对本类可见可见可见
      对子类可见可见不可见
      对外部(调用方)可见不可见不可见

这里写图片描述

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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值