C++面试题其三

news/2024/9/22 18:06:24/

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

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

29. typedef和define的区别

  • typedef:用于为现有类型定义一个新的名字。typedef是编译时的操作,它提供了类型别名,可以提高代码可读性和维护性。
    typedef unsigned long ulong;
    
  • #define:用于定义宏,它可以在预处理阶段进行文本替换,适用于常量、代码段等,但不具备类型检查。
    #define PI 3.14159
    

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

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

31. 纯虚函数

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

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关键字声明。
    class MyClass {friend void myFriendFunction(MyClass&);
    };
    
  • 友元类:允许另一个类访问本类的私有和保护成员。
    class AnotherClass {friend class MyClass;
    };
    

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

  • std::sort:对容器进行排序。
    std::sort(vec.begin(), vec.end());
    
  • std::find:在容器中查找元素。
    auto it = std::find(vec.begin(), vec.end(), value);
    
  • std::for_each:对容器中的每个元素执行操作。
    std::for_each(vec.begin(), vec.end(), [](int& val) { val *= 2; });
    
  • std::copy:复制容器内容。
    std::copy(src.begin(), src.end(), dest.begin());
    

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


http://www.ppmy.cn/news/1467387.html

相关文章

Java基础27,28(多线程,ThreadMethod ,线程安全问题,线程状态,线程池)

目录 一、多线程 1. 概述 2. 进程与线程 2.1 程序 2.2 进程 2.3 线程 2.4 进程与线程的区别 3. 线程基本概念 4.并发与并行 5. 线程的创建方式 方式一:继承Thread类 方式二:实现Runable接口 方式三:实现Callable接口 方式四&…

微信小程序-页面导航-导航传参

1.声明式导航传参 navigator组件的url属性用来指定将要跳转到的页面的路径,同时,路径的后面还可以携带参数: (1)参数与路径之间使用 ? 分割 (2)参数键与参数值用 相连 (3&…

Spring Security 注册过滤器关键点与最佳实践

在 Spring Security 框架中,注册过滤器是实现身份验证和授权的关键组件。正确配置和使用注册过滤器对于确保应用程序的安全性至关重要。以下是一些关于 Spring Security 注册过滤器的注意事项和最佳实践。 过滤器链顺序: 注册过滤器通常位于过滤器链的末…

【学习笔记】Axios、Promise

TypeScript 1、Axios 1.1、概述 1.2、axios 的基本使用 1.3、axios 的请求方式及对应的 API 1.4、axios 请求的响应结果结构 1.5、axios 常用配置选项 1.6、axios.create() 1.7、拦截器 1.8、取消请求2、Promise 2.1、封装 fs 读…

引领采购数字化变革,商越科技如何帮企业穿越周期?

导读 在企业“降本增效”的路上,采购数字化已经站上C位。采购数字化对企业究竟带来哪些价值? 在中国采购数字化赛道,行业领军者已经出现。 正文 面对经济环境的不确定性,企业都在寻找能够穿越周期的确定性。 “在经济不确定的大…

Kotlin 嵌套类和内部类

文章目录 嵌套类内部类 嵌套类 在类的内部可以定义其他的类,这是类结构上的嵌套(Nested)。 class Container {val name "Container"class NestedClass {fun getter() {// 此时无法访问外部类的成员// name}} }Note:接…

华为交换机、路由器配置查询、用户界面常见配置及安全加固

华为交换机、路由器配置查询、用户界面常见配置及安全加固。 一、查询命令 1.常用的查询命令 查看当前生效的配置信息: display current-configuration //正在生效的配置,默认参数不显示。查看当前视图下生效的配置信息: display this //常…

kafka-消费者服务搭建配置简单消费(SpringBoot整合Kafka)

文章目录 1、使用efak 创建 主题 my_topic1 并建立6个分区并给每个分区建立3个副本2、创建生产者发送消息3、application.yml配置4、创建消费者监听器5、创建SpringBoot启动类6、屏蔽 kafka debug 日志 logback.xml7、引入spring-kafka依赖 1、使用efak 创建 主题 my_topic1 并…