C++ 面试模拟02

news2024/9/19 23:46:26

第一部分:基础知识

  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 保证线程安全。
  • 实现拷贝构造和赋值运算符重载。

答案:

C++知识点/面试问题指南-CSDN博客

第一部分:基础知识

  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.coloradmin.cn/o/2147310.html

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

相关文章

wallpaper engine壁纸提取

下载提取软件RavioliGameTools_v2.10.zip https://pan.baidu.com/s/14ZCVw3ucRERsB-GGGoCOqQ 2.运行RExtractor.exe 3.Input file(s)、Output directory填好 4.勾选Allow scanning of unkown files 5.点击Start

智能办公新纪元:AI优秘圈引领未来工作方式

随着人工智能技术的不断进步&#xff0c;它已经开始渗透到我们工作与生活的每一个角落。在这一背景下&#xff0c;AI优秘圈以其创新的智能办公解决方案&#xff0c;正在重新定义企业的工作方式。本文将探讨AI优秘圈如何利用AI技术提升工作效率&#xff0c;降低成本&#xff0c;…

AI换脸等违法行为的最关键原因是个人隐私信息的泄露,避免在网络上发布包含个人敏感信息的照片。

文章目录 引言I 避免在网络上发布包含个人敏感信息的照片不要晒家门钥匙、车牌等照片。不要发布各种票据类的照片不要公布手持身份证或手持白纸照II 相关反制技术的开发和应用III 犯罪案例: 通过“换脸”伪造不雅照当事人犯罪团伙引言 当前AI换脸技术比较成熟,能支持视频通话…

25届和24届一样,涝的涝死旱的旱死

还是秋招 今天无意间翻到一篇帖子&#xff1a; 帖子提到自己的求职经历&#xff1a;想找个产品实习岗&#xff0c;但连实习岗都会要求有相关工作经历... 经典的"蛋生鸡&#xff0c;鸡生蛋"问题。 在经历了完整的秋招后&#xff0c;总的感觉是"涝的涝死&#xff…

基于MATLAB/Simulink的模型降阶方法介绍

降阶建模ROM(Reduced order modeling) 和模型降阶MOR(Model order reduction) 是降低全阶高保真模型的计算复杂性&#xff0c;同时在令人满意的误差范围内保持预期保真度的技术。 模型降阶技术可以解决科学计算邻域在建模仿真与工程应用中的几大痛点&#xff1a; 高保真模型计…

从工厂打螺丝到数据库专家(上)

可能是年纪大了&#xff0c;近期总是失眠&#xff01;不知为何&#xff0c;这段时间心情烦躁时&#xff0c;特别喜欢听老歌&#xff0c;难道这是中年人的通病&#xff1a;都喜欢怀旧&#xff1f; 在数据库恢复订阅伙伴群&#xff0c;大家经常讨论&#xff0c;总是在回味过去&a…

文心一言 VS 讯飞星火 VS chatgpt (350)-- 算法导论24.1 1题

一、在图 24-4上运行Bellman-Ford算法&#xff0c;使用结点 z z z作为源结点。在每一遍松弛过程中&#xff0c;以图中相同的次序对每条边进行松弛&#xff0c;给出每遍松弛操作后的 d d d值和 π π π值。然后&#xff0c;把边 ( z , x ) (z,x) (z,x)的权重改为 4 4 4&#xf…

面试官:什么是CAS?存在什么问题?

大家好&#xff0c;我是大明哥&#xff0c;一个专注「死磕 Java」系列创作的硬核程序员。 回答 CAS&#xff0c;Compare And Swap&#xff0c;即比较并交换&#xff0c;它一种无锁编程技术的核心机制。其工作方式分为两步&#xff1a; 比较&#xff1a;它首先会比较内存中的某…

汉字转拼音工具类

一&#xff0c;汉字转成拼音大写首字母 public static String chineseToPinyin(String chinese) {//创建一个 StringBuilder 对象用于存储转换后的拼音。StringBuilder pinyin new StringBuilder();//创建一个汉语拼音输出格式对象。HanyuPinyinOutputFormat format new Han…

Redis-01 入门和十大数据类型

Redis支持两种持久化方式&#xff1a;RDB持久化和AOF持久化。 1.RDB持久化是将Redis的数据以快照的形式保存在磁盘上&#xff0c;可以手动触发或通过配置文件设置定时触发。RDB保存的是Redis在某个时间点上的数据快照&#xff0c;可以通过恢复RDB文件来恢复数据。 2.AOF持久化…

MySQL 中的 EXPLAIN 命令:洞察查询性能的利器

《MySQL 中的 EXPLAIN 命令&#xff1a;洞察查询性能的利器》 在 MySQL 数据库的使用中&#xff0c;优化查询性能是至关重要的一项任务。而 EXPLAIN 命令就是我们用来深入了解查询执行计划的强大工具。今天&#xff0c;我们就来一起探讨如何在 MySQL 中使用 EXPLAIN 命令&…

数据结构-3.2.栈的顺序存储实现

一.顺序栈的定义&#xff1a;top指针指向栈顶元素 1.图解&#xff1a; 2.代码&#xff1a; #include<stdio.h> #define MaxSize 10 //定义栈最多存入的元素个数 ​ typedef struct {int data[MaxSize]; //静态数组存放栈中元素int top; //栈顶指针 } SqStack; ​ int…

python mysql pymysql 数据库操作,常用脚本,个人小工具

起因&#xff0c; 目的: 整理 mysql 工具 启动数据库 检查服务器是否启动了: Get-Service -Name ‘mysql*’ 如果没启动的话&#xff0c;那么就启动: net start MySQL80 (最好是开启管理员权限) 1, 日常最常用的&#xff0c;创建连接 --> 查看所有数据库 —> 查看所有…

预处理、makefile、静动态库编写、nfs挂载、快捷命令

c查看预处理后的文件 查看执行后的汇编代码 预处理过程 静态库和动态库 静态库编写 实践 a 动态库生成 查找文件命令 动态库升级 链接的库找不到 命名要为linfun.so 执行时-lfun才能找到 系统会将lfun补充成libfun查找&#xff08;系统默认路径/user/lib/...&#xff09; 链…

C++:string 类详解

目录 简介 使用 初始化(构造函数、拷贝构造函数) 析构函数 赋值运算符重载(operator) 成员常量(npos) 运算符重载[ ](operator[ ]) size() 和 length() 迭代器( begin() 和 end() ) 范围 for 迭代器和范围 for 的比较 反向迭代器( rbegin() 和 rend() ) const 迭…

每日刷题(算法)

我们N个真是太厉害了 思路&#xff1a; 我们先给数组排序&#xff0c;如果最小的元素不为1&#xff0c;那么肯定是吹牛的&#xff0c;我们拿一个变量记录前缀和&#xff0c;如果当前元素大于它前面所有元素的和1&#xff0c;那么sum1是不能到达的值。 代码&#xff1a; #def…

elasticsearch实战应用

Elasticsearch(ES)是一种基于分布式存储的搜索和分析引擎&#xff0c;目前在许多场景得到了广泛使用&#xff0c;比如维基百科和github的检索&#xff0c;使用的就是ES。本文总结了一些使用心得体会&#xff0c;希望对大家有所帮助。 一、技术选型 说到全文搜索大家肯定会想到…

软件测试 BUG 篇

目录 一、软件测试的生命周期 二、BUG 1. bug的概念 2. 描述bug的要素 3. bug的级别 4. bug的生命周期 5. 与开发产生争执怎么办&#xff1f;&#xff08;面试高频考题&#xff09; 5.1 先检查自身&#xff0c;是否bug描述不清楚 5.2 站在用户角度考虑并抛出问题 5.3 …

[vue2+axios]下载文件+文件下载为乱码

export function downloadKnowledage(parameter) {return axios({url: /knowledage/download,method: GET,params: parameter,responseType: blob}) }添加 responseType: blob’解决以下乱码现象 使用触发a标签下载文件 downloadKnowledage(data).then((res) > {let link …

PHP及Java等其他语言转Go时选择GoFly快速快速开发框架指南

概要 经过一年多的发展GoFly快速开发框架已被一千多家科技企业或开发者用于项目开发&#xff0c;他的简单易学得到其他语言转Go首选框架。且企业版的发展为GoFly社区提供资金&#xff0c;这使得GoFly快速框架得到良好的发展&#xff0c;GoFly技术团队加大投入反哺科技企业和开…