C++面试题其三

继续解答常见的C++面试题

继续上篇博客的解答,我们将进一步探讨C++中的一些关键概念和常见面试问题。

29. typedef和define的区别

  • typedef :用于为现有类型定义一个新的名字。typedef是编译时的操作,它提供了类型别名,可以提高代码可读性和维护性。

    cpp 复制代码
    typedef unsigned long ulong;
  • #define :用于定义宏,它可以在预处理阶段进行文本替换,适用于常量、代码段等,但不具备类型检查。

    cpp 复制代码
    #define PI 3.14159

30. 引用作为函数参数以及返回值的好处

  • 引用作为函数参数
    • 效率:避免了传值时的拷贝,提高了效率。
    • 修改原值:可以直接修改实参,允许函数改变调用者的变量值。
    • 传递大对象:适用于传递大对象,避免复制开销。
  • 引用作为返回值
    • 返回修改后的值:函数可以返回内部变量的引用,从而允许调用者继续操作这个变量。
    • 链式操作:可以进行链式调用。

31. 纯虚函数

纯虚函数是一个没有实现的虚函数,声明方式为:

cpp 复制代码
virtual void functionName() = 0;

纯虚函数要求派生类必须提供具体实现,使得类不能实例化,成为抽象类。

32. 什么是野指针

野指针是指向已释放内存或未分配内存的指针,使用野指针会导致未定义行为,如程序崩溃或数据错误。避免野指针的方法包括初始化指针、及时置空和小心内存管理。

33. 线程安全和线程不安全

  • 线程安全:代码在多线程环境下运行时,不会引发数据竞争和未定义行为,通常通过锁、互斥量等机制实现。
  • 线程不安全:代码在多线程环境下可能引发数据竞争,导致不可预测的行为和数据错误。

34. C++中内存泄漏的几种情况

  • 未释放动态内存 :分配的内存未被释放,如new没有对应的delete
  • 循环引用:智能指针之间形成环状引用,导致内存无法释放。
  • 忘记释放资源:文件句柄、网络连接等资源未关闭。

35. 栈溢出的原因以及解决方法

  • 原因:函数递归调用过深,局部变量过多,超过了栈的大小限制。
  • 解决方法:优化递归算法,减少递归深度,或者增大栈的大小限制。

36. C++标准库vector以及迭代器

  • vector :动态数组,提供随机访问和自动扩展功能。常用操作包括push_backpop_backsize等。
  • 迭代器 :用于遍历容器,提供了类似指针的接口。常见迭代器操作包括beginend++--等。

38. C++中vector和list的区别

  • vector
    • 动态数组,支持随机访问。
    • 内存连续,插入和删除元素代价较高(需要移动元素)。
  • list
    • 双向链表,不支持随机访问。
    • 插入和删除元素代价低,只需调整指针。

39. C++中的基本数据类型及派生类型

  • 基本数据类型:int、char、float、double、bool等。
  • 派生类型:包括数组、指针、引用、函数、类、结构体、联合体、枚举等。

40. 友元函数和友元类

  • 友元函数 :允许访问类的私有和保护成员的函数,在类中使用friend关键字声明。

    cpp 复制代码
    class MyClass {
        friend void myFriendFunction(MyClass&);
    };
  • 友元类 :允许另一个类访问本类的私有和保护成员。

    cpp 复制代码
    class AnotherClass {
        friend class MyClass;
    };

41. C++函数库中一些实用的函数

  • std::sort :对容器进行排序。

    cpp 复制代码
    std::sort(vec.begin(), vec.end());
  • std::find :在容器中查找元素。

    cpp 复制代码
    auto it = std::find(vec.begin(), vec.end(), value);
  • std::for_each :对容器中的每个元素执行操作。

    cpp 复制代码
    std::for_each(vec.begin(), vec.end(), [](int& val) { val *= 2; });
  • std::copy :复制容器内容。

    cpp 复制代码
    std::copy(src.begin(), src.end(), dest.begin());

通过这些问题的深入解答,进一步提升了对C++语言的理解和应用能力。面试中,不仅要掌握理论知识,更要熟练运用这些知识解决实际问题。

相关推荐
Python私教几秒前
Go语言现代web开发15 Mutex 互斥锁
开发语言·前端·golang
hong1616883 分钟前
VSCode中配置C/C++环境
c语言·c++·vscode
小羊在奋斗17 分钟前
【C++】探秘二叉搜索树
c++·人工智能·神经网络·机器学习
小电玩18 分钟前
JAVA SE8
java·开发语言
努力的布布37 分钟前
Spring源码-从源码层面讲解声明式事务的运行流程
java·spring
白葵新37 分钟前
PCL addLine可视化K近邻
c++·人工智能·算法·计算机视觉·3d
程序员大金43 分钟前
基于SpringBoot的旅游管理系统
java·vue.js·spring boot·后端·mysql·spring·旅游
小丁爱养花44 分钟前
记忆化搜索专题——算法简介&力扣实战应用
java·开发语言·算法·leetcode·深度优先
大汉堡~1 小时前
代理模式-动态代理
java·代理模式
爱上语文1 小时前
Springboot三层架构
java·开发语言·spring boot·spring·架构