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++语言的理解和应用能力。面试中,不仅要掌握理论知识,更要熟练运用这些知识解决实际问题。

相关推荐
AI街潜水的八角2 分钟前
基于C++的决策树C4.5机器学习算法(不调包)
c++·算法·决策树·机器学习
追风林4 分钟前
mac m1 docker本地部署canal 监听mysql的binglog日志
java·docker·mac
芒果披萨19 分钟前
El表达式和JSTL
java·el
q5673152319 分钟前
在 Bash 中获取 Python 模块变量列
开发语言·python·bash
JSU_曾是此间年少32 分钟前
数据结构——线性表与链表
数据结构·c++·算法
许野平44 分钟前
Rust: 利用 chrono 库实现日期和字符串互相转换
开发语言·后端·rust·字符串·转换·日期·chrono
也无晴也无风雨1 小时前
在JS中, 0 == [0] 吗
开发语言·javascript
狂奔solar1 小时前
yelp数据集上识别潜在的热门商家
开发语言·python
duration~1 小时前
Maven随笔
java·maven
zmgst1 小时前
canal1.1.7使用canal-adapter进行mysql同步数据
java·数据库·mysql