C++ 面试模拟02

第一部分:基础知识

  1. 什么是拷贝构造函数和赋值运算符?它们之间有什么区别?
  2. 在 C++ 中,const 关键字的作用是什么?有哪些常见用法?
  3. C++ 中的内存管理机制是怎样的?如何避免内存泄漏?
  4. 虚函数(virtual function)的作用是什么?虚函数表(vtable)是如何工作的?

第二部分:面向对象编程

  1. 什么是多态性?C++ 中如何实现运行时多态?
  2. 请解释什么是继承以及继承的优缺点。
  3. C++ 中的“菱形继承”是什么?如何通过虚继承来解决它带来的问题?
  4. 什么是抽象类?抽象类与接口类有何不同?

第三部分:STL(标准模板库)

  1. std::vectorstd::list 有什么区别?它们各自的优点和缺点是什么?
  2. 什么是迭代器?有哪些类型的迭代器?
  3. std::mapstd::unordered_map 的底层实现分别是什么?性能有何差异?
  4. C++ 中的容器适配器有哪些?请举例说明。

第四部分:并发与多线程

  1. C++ 中如何创建线程?有哪些常见的线程管理方式?
  2. 什么是互斥锁(mutex)?如何避免死锁?
  3. 解释一下条件变量(condition variable)的作用,并给出一个简单的使用例子。
  4. 什么是线程局部存储(Thread Local Storage)?在 C++ 中如何使用?

第五部分:C++ 高级特性

  1. 什么是移动语义?C++11 中如何实现移动构造函数与移动赋值运算符?
  2. C++20 中的协程(coroutine)是什么?它们是如何工作的?
  3. 模板元编程(Template Metaprogramming)是什么?在 C++ 中有哪些实际应用?
  4. 什么是 SFINAE?在模板中如何利用 SFINAE 进行类型选择?

第六部分:现场编程

题目:

请你实现一个线程安全的计数器类 ThreadSafeCounter,它支持以下功能:

  • increment():计数器加 1
  • decrement():计数器减 1
  • get():返回当前计数器的值

要求:

  • 使用 std::mutex 保证线程安全。
  • 实现拷贝构造和赋值运算符重载。

第一部分:基础知识

  1. 拷贝构造函数和赋值运算符的区别

    • 拷贝构造函数:当用一个对象初始化另一个新对象时调用,用于对象的创建。
    • 赋值运算符:在已存在对象的基础上,将另一个对象的内容赋值给它。
    • 区别:拷贝构造函数是在对象初始化时调用的,赋值运算符则在对象已经创建后进行赋值。
  2. const 关键字的作用

    • 修饰变量:表示该变量的值不能修改。
    • 修饰指针:区分指针本身是否可变和指向的对象是否可变。
    • 修饰成员函数:表示该成员函数不会修改类的成员变量。
  3. 内存管理

    • C++ 使用动态分配(new/delete)、栈分配以及 RAII(资源获取即初始化)来管理内存。
    • 避免内存泄漏的方法包括使用智能指针(如 std::shared_ptrstd::unique_ptr)。
  4. 虚函数和 vtable

    • 虚函数:用于实现运行时多态,基类中标记为 virtual 的函数可以在派生类中被重写。
    • 虚函数表(vtable):编译器为包含虚函数的类创建一个表,指向虚函数的地址,保证在运行时能够调用正确的函数。

第二部分:面向对象编程

  1. 多态性

    • C++ 中通过虚函数实现运行时多态。基类的虚函数可以在派生类中重写,通过基类指针或引用调用时,动态地选择合适的派生类实现。
  2. 继承

    • 优点:允许代码重用和扩展基类功能。
    • 缺点:不当的使用可能导致强耦合,难以维护。
  3. 菱形继承和虚继承

    • 菱形继承:如果一个类从多个基类继承,而这些基类又继承自同一祖先类,会导致多个基类有相同的祖先成员。
    • 虚继承:通过 virtual 继承,确保继承链中的祖先类只会有一份副本。
  4. 抽象类

    • 抽象类:至少包含一个纯虚函数(= 0 的函数)。不能实例化,只能被继承。
    • 接口类:所有成员函数都为纯虚函数。

第三部分:STL

  1. std::vectorstd::list 区别

    • std::vector:基于动态数组,支持随机访问,插入/删除代价高(中间位置)。
    • std::list:基于双向链表,不支持随机访问,插入/删除较快。
    • 优缺点vector 适合频繁随机访问,list 适合频繁插入/删除。
  2. 迭代器的类型

    • 输入迭代器、输出迭代器、前向迭代器、双向迭代器、随机访问迭代器。
  3. std::map vs std::unordered_map

    • std::map:基于红黑树(有序),O(log n) 查找。
    • std::unordered_map:基于哈希表(无序),O(1) 平均查找,但最坏情况 O(n)。
  4. 容器适配器

    • 包括 std::stackstd::queuestd::priority_queue,它们通过封装其他容器(如 dequelist)实现特定的行为。

 

第四部分:并发与多线程

  1. 线程的创建

    • 使用 std::thread 创建线程:
std::thread t([] { std::cout << "Thread is running"; });
t.join();  // 等待线程结束
  • 互斥锁(mutex)与死锁

    • 互斥锁std::mutex 用于保护共享资源避免数据竞争。通过 std::lock_guardstd::unique_lock 自动管理锁。
    • 避免死锁:使用相同顺序加锁,或者使用 std::lock() 同时加锁多个资源。
  • 条件变量

    • 用于线程间同步,等待特定条件:
std::condition_variable cv;
std::mutex mtx;
bool ready = false;
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, [&ready] { return ready; });

线程局部存储

  • 使用 thread_local 关键字为每个线程定义独立的存储空间:
thread_local int x = 0;  // 每个线程都有自己独立的 x 变量

第五部分:C++ 高级特性

  1. 移动语义

    • 移动语义通过 移动构造函数移动赋值运算符 避免不必要的深拷贝,使用 std::move 来将对象转化为右值引用,从而实现资源的转移而不是复制。
  2. C++20 协程

    • 协程通过 co_awaitco_yieldco_return 实现协程的控制流,用来处理异步任务和生成器。
    • 使用例:
std::future<int> asyncAdd(int a, int b) {co_return a + b;
}
  • 模板元编程

    • 通过模板递归和模板特化实现编译期计算。常见应用包括类型萃取(type traits)和元函数。
  • SFINAE

    • 在模板中,"Substitution Failure Is Not An Error" 规则允许在匹配失败时尝试其他模板。常用于限制模板特化。
template<typename T>
std::enable_if_t<std::is_integral<T>::value, T> add(T a, T b) { return a + b; }

第六部分:现场编程

#include <iostream>
#include <mutex>class ThreadSafeCounter {
private:int counter;std::mutex mtx;public:ThreadSafeCounter() : counter(0) {}// 增加计数void increment() {std::lock_guard<std::mutex> lock(mtx);++counter;}// 减少计数void decrement() {std::lock_guard<std::mutex> lock(mtx);--counter;}// 获取当前计数int get() const {std::lock_guard<std::mutex> lock(mtx);return counter;}// 拷贝构造函数ThreadSafeCounter(const ThreadSafeCounter& other) {std::lock_guard<std::mutex> lock(other.mtx);counter = other.counter;}// 赋值运算符ThreadSafeCounter& operator=(const ThreadSafeCounter& other) {if (this != &other) {std::lock_guard<std::mutex> lockThis(mtx);std::lock_guard<std::mutex> lockOther(other.mtx);counter = other.counter;}return *this;}
};

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/879724.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为解决bypy大文件上传报错—获取百度云文件直链并使用Aria2上传文件至服务器

问题描述 一方面组内的服务器的带宽比较小&#xff0c;另一方面使用bypy方式进行大文件(大于15G)上传时会报错&#xff08;虽然有时可以成功上传&#xff0c;但是不稳定&#xff09;&#xff1a; 解决方式 总体思路: 获得云盘需要下载文件的直链复制直链到服务器中使用自带…

24年蓝桥杯及攻防世界赛题-MISC-3

21 reverseMe 复制图片&#xff0c;在线ocr识别&#xff0c;https://ocr.wdku.net/&#xff0c;都不费眼睛。 22 misc_pic_again ┌──(holyeyes㉿kali2023)-[~/Misc/tool-misc/zsteg] └─$ zsteg misc_pic_again.png imagedata … text: “$$KaTeX parse error: Undefined…

Excel快速填充颜色,快捷键真香

大家好&#xff0c;这里是效率办公指南&#xff01; &#x1f3a8; 在Excel中工作时&#xff0c;我们经常需要对单元格进行颜色填充&#xff0c;以突出显示重要数据或增加视觉可读性。今天&#xff0c;我们将分享几种快速填充颜色的方法&#xff0c;帮助你提高工作效率&#x…

Golang使用ReverseProxy实现反向代理

目录 1.源码结构体 2.官方单机示例 3.使用示例 4.简单的http服务&#xff08;用于测试&#xff09; 1.源码结构体 type ReverseProxy struct {// Rewrite 必须是一个函数&#xff0c;用于将请求修改为要使用 Transport 发送的新请求。然后&#xff0c;其响应将原封不动地…

用ASR PRO离线语音芯片和月饼盒做一个会跑会跳会说话的机器狗

中秋节刚过&#xff0c;大家月饼盒应该还有&#xff0c;不要扔&#xff0c;可以做点小玩意。 机器狗的创意来自B站石桥北的视频&#xff0c;他使用了一块ESP32芯片和打印件加四个舵机实现&#xff0c;应该说是比较复杂的&#xff0c;需要有3D打印机打印外壳&#xff0c;还得会…

Linux标准IO-系统调用详解

1.1 系统调用 系统调用&#xff08;system call&#xff09;其实是 Linux 内核提供给应用层的应用编程接口&#xff08;API&#xff09;&#xff0c;是 Linux 应用层进入内核的入口。不止 Linux 系统&#xff0c;所有的操作系统都会向应用层提供系统调用&#xff0c;应用程序通…

【Harmony】轮播图特效,持续更新中。。。。

效果预览 swiper官网例子 Swiper 高度可变化 两边等长露出&#xff0c;跟随手指滑动 Swiper 指示器导航点位于 Swiper 下方 一、官网 例子 参考代码&#xff1a; // xxx.ets class MyDataSource implements IDataSource {private list: number[] []constructor(list: nu…

软考高级:嵌入式系统调度算法 AI 解读

嵌入式系统中的调度算法用于管理任务的执行顺序&#xff0c;确保系统资源能够有效分配。以下是几种常见的调度算法的通俗讲解。 生活化例子 想象你是一位超市收银员&#xff0c;有很多顾客排队&#xff0c;每位顾客都可以看作一个任务&#xff0c;收银台就是你的处理器。你需…

PostgreSQL技术内幕10:PostgreSQL事务原理解析-日志模块介绍

文章目录 0.简介1.PG日志介绍2.事务日志介绍3.WAL分析3.1 WAL概述3.2 WAL设计考虑3.2.1 存储格式3.2.2 实现方式3.2.3 数据完整性校验3.3 check ponit 4.事务提交日志&#xff08;CLOG&#xff09;4.1 clog存储使用介绍4.2 slru缓冲池并发控制 0.简介 本文将延续上一篇文章内容…

【无标题】Java_Se 数据变量与运算符

标识符、变量、常量、数据类型、运算符、基本数据类型的类型转换等。这些是编程中的“砖块”&#xff0c;是编程的基础。要想开始正式编程&#xff0c;还需要再学“控制语句”&#xff0c;控制语句就像“水泥”&#xff0c;可以把“砖块”粘到一起&#xff0c;最终形成“一座大…

华为OD机试 - 二维伞的雨滴效应(Python/JS/C/C++ 2024 E卷 200分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华为OD刷题交流群&#xff0c;…

ClickHouse-Kafka Engine 正确的使用方式

Kafka 是大数据领域非常流行的一款分布式消息中间件&#xff0c;是实时计算中必不可少的一环&#xff0c;同时一款 OLAP 系统能否对接 Kafka 也算是考量是否具备流批一体的衡量指标之一。ClickHouse 的 Kafka 表引擎能够直接与 Kafka 系统对接&#xff0c;进而订阅 Kafka 中的 …

镀金引线---

一、沉金和镀金 沉金和镀金都是常见的PCB金手指处理方式&#xff0c;它们各有优劣势&#xff0c;选择哪种方式取决于具体的应用需求和预算。 沉金&#xff08;ENIG&#xff09;是一种常用的金手指处理方式&#xff0c;它通过在金手指表面沉积一层金层来提高接触性能和耐腐蚀性…

【C++】模拟实现vector

在上篇中我们已经了解过的vector各种接口的功能使用&#xff0c;接下来我们就试着模拟实现一下吧&#xff01; 注意&#xff1a;我们在此实现的和C标准库中实现的有所不同&#xff0c;其目的主要是帮助大家大概理解底层原理。 我们模拟vector容器的大致框架是&#xff1a; t…

2024年【四川省安全员B证】新版试题及四川省安全员B证考试试卷

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 四川省安全员B证新版试题参考答案及四川省安全员B证考试试题解析是安全生产模拟考试一点通题库老师及四川省安全员B证操作证已考过的学员汇总&#xff0c;相对有效帮助四川省安全员B证考试试卷学员顺利通过考试。 1、…

【webpack4系列】webpack基础用法(二)

文章目录 entryoutputloaderpluginmode前端构建基础配置关联HTML插件html-webpack-plugin构建 CSS 解析 ES6和React JSX解析 ES6解析 React JSX 解析CSS、Less和Sass解析CSS解析Less解析sass 解析图片和字体资源解析&#xff1a;解析图片资源解析&#xff1a;解析字体资源解析&…

JS - 获取剪切板内容 Clipboard API

目录 1&#xff0c;需求最终效果 2&#xff0c;实现示例 3&#xff0c;注意点1&#xff0c;只支持安全上下文环境2&#xff0c;只能读取当前页面的剪切板3&#xff0c;权限获取问题4&#xff0c;获取内容的 MIME_TYPE 问题1&#xff0c;文本内容2&#xff0c;图片内容 5&#x…

魅思-视频管理系统 getOrderStatus SQL注入漏洞复现

0x01 产品简介 魅思-视频管理系统是一款集成了视频管理、用户管理、手机端应用封装等功能的综合性视频管理系统。该系统不仅以其强大的视频管理功能、灵活的用户管理机制、便捷的手机端应用封装功能以及高安全性和现代化的界面设计,成为了市场上备受关注的视频管理系统之一。…

一个基于 laravel 和 amis 开发的后台框架, 友好的组件使用体验,可轻松实现复杂页面(附源码)

前言 随着互联网应用的发展&#xff0c;后台管理系统的复杂度不断增加&#xff0c;对于开发者而言&#xff0c;既要系统的功能完备&#xff0c;又要追求开发效率的提升。然而&#xff0c;传统的开发方式往往会导致大量的重复劳动&#xff0c;尤其是在构建复杂的管理页面时。有…

Web植物管理系统-下位机部分

本节主要展示上位机部分&#xff0c;采用BSP编程&#xff0c;不附带BSP中各个头文件的说明&#xff0c;仅仅是对main逻辑进行解释 main.c 上下位机通信 通过串口通信&#xff0c;有两位数据验证头&#xff08;verify数组中保存对应的数据头 0xAA55) 通信格式 上位发送11字节…