【面经分享-CPP篇】[建议收藏!!] C++基础20问-01

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员

✨ 本系列打算持续跟新c++面试基础

👏 感谢大家的订阅➕ 和 喜欢💗

文章目录

    • 1.题目:解释C++中的RAII机制。
    • 2.题目:解释C++中的智能指针及其类型。
    • 3.题目:解释C++中的多态性及其实现方式。
    • 4.题目:解释C++中的引用和指针的区别。
    • 5.题目:如何在C++中进行异常处理?
    • 6.题目:解释C++11中的`std::move`和`std::forward`。
    • 7.题目:如何实现一个线程安全的单例模式?
    • 8.题目:解释C++中的虚函数和纯虚函数。
    • 9.题目:解释C++中的命名空间及其用途。
    • 10.题目:解释C++中的四种类型转换:`static_cast`、`dynamic_cast`、`const_cast`、`reinterpret_cast`。
    • 11.题目:如何在C++中使用函数指针?
    • 12.题目:解释C++11中的Lambda表达式及其用途。
    • 13.题目:什么是内联函数?如何在C++中定义内联函数?
    • 14.题目:解释C++中的构造函数和析构函数。
    • 15.题目:什么是友元函数?如何在C++中定义友元函数?
    • 16.题目:解释C++ STL中的`std::vector`和`std::list`的区别。
    • 17.题目:解释C++11中的`auto`和`decltype`关键字。
    • 18.题目:如何检测和防止内存泄漏?
    • 19.题目:解释C++中的模板及其用途。
    • 20.题目:如何在C++中重载运算符?

1.题目:解释C++中的RAII机制。

考点:C++基础
答案解析
RAII(Resource Acquisition Is Initialization)是一种管理资源的编程惯用法。它的核心思想是将资源的获取和释放绑定到对象的生命周期。资源在对象创建时获取,在对象销毁时释放。常见的应用包括文件句柄、内存管理等。C++中的智能指针(如std::unique_ptrstd::shared_ptr)就是RAII的典型实现。

2.题目:解释C++中的智能指针及其类型。

考点:内存管理
答案解析
C++11引入了智能指针来自动管理内存,避免内存泄漏。主要有三种类型:

  • std::unique_ptr:独占所有权的智能指针,不能复制,只能移动。
  • std::shared_ptr:共享所有权的智能指针,多个shared_ptr可以指向同一个对象,使用引用计数来管理对象的生命周期。
  • std::weak_ptr:弱引用,不影响shared_ptr的引用计数,通常用于解决循环引用问题。

3.题目:解释C++中的多态性及其实现方式。

考点:面向对象编程
答案解析
多态性是面向对象编程的一个基本特性,允许同一接口调用不同的实现。C++中通过虚函数实现多态性。基类中声明虚函数,派生类中重写该虚函数,通过基类指针或引用调用派生类的实现。

class Base {
public:virtual void show() {std::cout << "Base class" << std::endl;}
};class Derived : public Base {
public:void show() override {std::cout << "Derived class" << std::endl;}
};int main() {Base* b = new Derived();b->show(); // 输出 "Derived class"delete b;return 0;
}

4.题目:解释C++中的引用和指针的区别。

考点:C++基础
答案解析

  • 引用:引用是一个变量的别名,必须在声明时初始化,不能改变引用的对象。引用使用起来更安全,因为它不能为null。
  • 指针:指针是一个变量,存储另一个变量的地址,可以在声明后初始化,也可以改变指向的对象。指针可以为null,使用时需要注意内存管理。

5.题目:如何在C++中进行异常处理?

考点:异常处理
答案解析
C++中使用trycatchthrow关键字进行异常处理。try块中包含可能抛出异常的代码,catch块中处理异常,throw用于抛出异常。

try {// 可能抛出异常的代码throw std::runtime_error("An error occurred");
} catch (const std::exception& e) {std::cout << "Caught exception: " << e.what() << std::endl;
}

6.题目:解释C++11中的std::movestd::forward

考点:C++ 高级特性
答案解析

  • std::move:用于将对象转换为右值引用,从而启用移动语义,避免不必要的拷贝。
  • std::forward:用于完美转发,将参数保持其原有的左值或右值属性,通常在模板中使用。

7.题目:如何实现一个线程安全的单例模式?

考点:多线程与并发
答案解析
线程安全的单例模式可以通过双重检查锁定(Double-Checked Locking)来实现。以下是一个示例代码:

#include <mutex>class Singleton {
public:static Singleton* getInstance() {if (instance == nullptr) {std::lock_guard<std::mutex> lock(mutex_);if (instance == nullptr) {instance = new Singleton();}}return instance;}private:Singleton() {}static Singleton* instance;static std::mutex mutex_;
};Singleton* Singleton::instance = nullptr;
std::mutex Singleton::mutex_;

8.题目:解释C++中的虚函数和纯虚函数。

考点:继承与多态
答案解析

  • 虚函数:在基类中使用virtual关键字声明的函数,允许在派生类中重写,实现多态性。
  • 纯虚函数:在基类中声明但不提供实现的虚函数,使用= 0语法,表示该类是抽象类,不能实例化,必须在派生类中实现。
class Base {
public:virtual void show() {std::cout << "Base class" << std::endl;}virtual void pureVirtualFunction() = 0; // 纯虚函数
};class Derived : public Base {
public:void show() override {std::cout << "Derived class" << std::endl;}void pureVirtualFunction() override {std::cout << "Implemented pure virtual function" << std::endl;}
};int main() {Base* b = new Derived();b->show(); // 输出 "Derived class"b->pureVirtualFunction(); // 输出 "Implemented pure virtual function"delete b;return 0;
}

9.题目:解释C++中的命名空间及其用途。

考点:名字空间
答案解析
命名空间用于组织代码,避免命名冲突。可以使用namespace关键字定义命名空间,并使用::操作符访问命名空间中的成员。

namespace MyNamespace {void myFunction() {std::cout << "Hello from MyNamespace" << std::endl;}
}int main() {MyNamespace::myFunction(); // 输出 "Hello from MyNamespace"return 0;
}

10.题目:解释C++中的四种类型转换:static_castdynamic_castconst_castreinterpret_cast

考点:类型转换
答案解析

  • static_cast:用于基本类型之间的转换和具有明确继承关系的指针或引用的转换。
  • dynamic_cast:用于多态类型的安全向下转换,运行时检查类型。
  • const_cast:用于去除或添加const属性。
  • reinterpret_cast:用于任意类型的指针转换,通常用于底层操作。

11.题目:如何在C++中使用函数指针?

考点:函数指针
答案解析
函数指针是指向函数的指针,可以用于回调函数或实现多态性。

#include <iostream>void hello() {std::cout << "Hello, world!" << std::endl;
}int main() {void (*funcPtr)() = &hello;funcPtr(); // 输出 "Hello, world!"return 0;
}

12.题目:解释C++11中的Lambda表达式及其用途。

考点:Lambda 表达式
答案解析
Lambda表达式是匿名函数,用于简化代码,特别是在STL算法中。语法为[捕获列表](参数列表) -> 返回类型 { 函数体 }

#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> vec = {1, 2, 3, 4, 5};std::for_each(vec.begin(), vec.end(), [](int x) {std::cout << x << " ";}); // 输出 "1 2 3 4 5"return 0;
}

13.题目:什么是内联函数?如何在C++中定义内联函数?

考点:内联函数
答案解析
内联函数是建议编译器将函数调用展开为函数体,以减少函数调用的开销。使用inline关键字定义内联函数。

inline int add(int a, int b) {return a + b;
}int main() {std::cout << add(3, 4) << std::endl; // 输出 7return 0;
}

14.题目:解释C++中的构造函数和析构函数。

考点:构造函数与析构函数
答案解析

  • 构造函数:在对象创建时自动调用,用于初始化对象。可以重载。
  • 析构函数:在对象销毁时自动调用,用于清理资源。不能重载,类中只能有一个析构函数。
class MyClass {
public:MyClass() {std::cout << "Constructor called" << std::endl;}~MyClass() {std::cout << "Destructor called" << std::endl;}
};int main() {MyClass obj; // 输出 "Constructor called"// 程序结束时输出 "Destructor called"return 0;
}

15.题目:什么是友元函数?如何在C++中定义友元函数?

考点:友元函数
答案解析
友元函数是可以访问类的私有和保护成员的非成员函数。使用friend关键字声明友元函数。

class MyClass {
private:int data;
public:MyClass(int d) : data(d) {}friend void showData(const MyClass& obj);
};void showData(const MyClass& obj) {std::cout << "Data: " << obj.data << std::endl;
}int main() {MyClass obj(42);showData(obj); // 输出 "Data: 42"return 0;
}

16.题目:解释C++ STL中的std::vectorstd::list的区别。

考点:STL 容器
答案解析

  • std::vector:动态数组,支持随机访问,插入和删除操作的时间复杂度为O(n),适用于需要频繁访问元素的场景。
  • std::list:双向链表,不支持随机访问,插入和删除操作的时间复杂度为O(1),适用于需要频繁插入和删除元素的场景。

17.题目:解释C++11中的autodecltype关键字。

考点:C++11 新特性
答案解析

  • auto:用于自动推导变量的类型,简化代码。
  • decltype:用于推导表达式的类型,通常用于模板编程。
int main() {auto x = 5; // x 的类型为 intdecltype(x) y = 10; // y 的类型为 intstd::cout << x << " " << y << std::endl; // 输出 "5 10"return 0;
}

18.题目:如何检测和防止内存泄漏?

考点:内存泄漏
答案解析

  • 检测:可以使用工具如Valgrind、AddressSanitizer等来检测内存泄漏。
  • 防止:使用RAII和智能指针(如std::unique_ptrstd::shared_ptr)来自动管理内存,避免手动管理内存带来的风险。

19.题目:解释C++中的模板及其用途。

考点:模板编程
答案解析
模板是C++中的一种泛型编程工具,允许编写与类型无关的代码。模板分为函数模板和类模板。函数模板用于定义与类型无关的函数,类模板用于定义与类型无关的类。

template <typename T>
T add(T a, T b) {return a + b;
}template <typename T>
class Stack {
private:std::vector<T> elems;
public:void push(T const& elem) {elems.push_back(elem);}void pop() {if (elems.empty()) {throw std::out_of_range("Stack<>::pop(): empty stack");}elems.pop_back();}T top() const {if (elems.empty()) {throw std::out_of_range("Stack<>::top(): empty stack");}return elems.back();}
};

20.题目:如何在C++中重载运算符?

考点:运算符重载
答案解析
运算符重载允许为用户定义的类型定义新的运算符行为。可以通过成员函数或友元函数来重载运算符。

class Complex {
private:double real, imag;
public:Complex(double r, double i) : real(r), imag(i) {}Complex operator+(const Complex& other) const {return Complex(real + other.real, imag + other.imag);}void print() const {std::cout << "(" << real << ", " << imag << ")" << std::endl;}
};int main() {Complex c1(1.0, 2.0), c2(2.0, 3.0);Complex c3 = c1 + c2;c3.print(); // 输出 (3.0, 5.0)return 0;
}

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

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

相关文章

从内存到sql的upsert

业务的upsert ​ 在写业务时&#xff0c;大家一开始都会以顺序流程的方式开始着手写代码&#xff0c;CR时再看代码&#xff0c;会有不一样的感觉。 1. 需求描述 ​ 现有一张数据库表&#xff0c;表字段结构如下&#xff1a; 字段名称类型描述uuidstring数据的唯一键datastrin…

代码随想录算法训练营第四十六天|KM52. 携带研究材料、518. 零钱兑换 II、377. 组合总和 Ⅳ

代码随想录算法训练营第四十六天 KM52. 携带研究材料 题目链接&#xff1a;KM52. 携带研究材料 确定dp数组以及下标的含义&#xff1a;j的含义是当前背包的最大容量&#xff0c;dp[j]背包内物品的总价值确定递推公式&#xff1a;背包最大容量固定为j&#xff0c;每个循环尝试…

Nginx01-HTTP简介与Nginx简介(安装、命令介绍、目录介绍、配置文件介绍)

目录 HTTP简介HTTP原理查看访问网站的详细流程curl -vwget --debug 查看网站访问量HTTP协议版本HTTP协议交互HTTP 请求请求报文起始行请求头 HTTP响应响应报文起始行响应头 Nginx常见的Web服务常见网站服务 安装NginxNginx目录结构Nginx启动管理Nginx常用命令 Nginx配置文件主配…

国内外主流大模型语言技术大比拼

国内外主流大模型语言技术对比 2024 自2017年起&#xff0c;美国深度布局人工智能&#xff0c;全面融入经济、文化与社会。至2023年&#xff0c;中国凭借自研技术平台崭露头角&#xff0c;ChatGPT及其技术成国家战略焦点&#xff0c;引领未来科技浪潮。中美竞逐&#xff0c;人工…

Milvus向量数据库:开启向量搜索新纪元

Milvus向量数据库&#xff1a;开启向量搜索新纪元 随着人工智能和机器学习技术的飞速发展&#xff0c;向量数据在各个领域的应用越来越广泛&#xff0c;如推荐系统、自然语言处理、计算机视觉等。在这样的背景下&#xff0c;如何高效地存储、查询和管理向量数据成为了一个重要的…

香橙派 AI pro:AI 加速初体验

香橙派 AI pro&#xff1a;AI 加速初体验 在AI领域&#xff0c;不断涌现的硬件产品为开发者提供了前所未有的便利和可能性。今天&#xff0c;我要介绍的这款产品——香橙派 AIpro&#xff0c;就是其中的佼佼者。在昇腾 AI 芯片的加持下&#xff0c;这款开发板有着出色的算力。…

961题库 北航计算机 操作系统 附答案 选择题形式

有题目和答案&#xff0c;没有解析&#xff0c;不懂的题问大模型即可&#xff0c;无偿分享。 第1组 习题 计算机系统的组成包括&#xff08; &#xff09; A、程序和数据 B、处理器和内存 C、计算机硬件和计算机软件 D、处理器、存储器和外围设备 财务软件是一种&#xff…

【Qt 学习笔记】Qt窗口 | 对话框 | Qt对话框的分类及介绍

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt窗口 | 对话框 | 模态对话框 文章编号&#xff1a;Qt 学习笔记 / 51…

Java反序列化漏洞与URLDNS利用链分析

前言 前面学习过 Java 反序列化漏洞的部分知识&#xff0c;总结过几篇文章&#xff1a; 文章发布日期内容概括《渗透测试-JBoss 5.x/6.x反序列化漏洞》2020-07-08JBoss 反序列化漏洞 CVE-2017-12149 的简单复现&#xff0c;使用了 ysoserial 和 CC5 链&#xff0c;未分析漏洞…

easy-captcha生成验证码

引入依赖 <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>…

[力扣题解] 404. 左叶子之和

题目&#xff1a;404. 左叶子之和 思路 前序遍历&#xff08;随便怎么遍历&#xff09;&#xff1b; 在遇到左叶子时处理数据&#xff0c;选择中、左、右里面的左的时候再判断这个节点是不是叶子&#xff1b; 代码 /*** Definition for a binary tree node.* struct TreeNo…

Unity2D游戏开发-玩家控制

在Unity2D游戏开发中&#xff0c;玩家控制是游戏互动性的核心。本文将解析一个典型的Unity2D玩家控制脚本&#xff0c;探讨如何实现流畅的玩家移动、跳跃和动画切换。以下是一个Unity脚本示例&#xff0c;实现了这些基础功能。 1. 脚本结构 using System.Collections; using …

机械设计手册第一册:公差

形位公差的标注&#xff1a; 形位公差框格中&#xff0c;不仅要表达形位公差的特征项目、基准代号和其他符号&#xff0c;还要正确给出公差带的大小、形状等内容。 1.形位公差框格&#xff1a; 形位公差框格由两个框格或多个格框组成&#xff0c;框格中的主要内容从左到右按…

(2024,扩散,去噪调度,维度,误差,收敛速度)适应基于分数的扩散模型中的未知低维结构

Adapting to Unknown Low-Dimensional Structures in Score-Based Diffusion Models 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 1. 引言 1.1 扩散模型 1.2 现有结果的不…

服务器硬件基础知识学习

服务器硬件基础知识涵盖了从CPU到存储&#xff0c;再到网络连接和总线技术等关键组件。 1. 处理器 - 两大流派&#xff1a;我们常用的处理器主要分为Intel和AMD两大阵营。Intel的Xeon系列和AMD的EPYC系列都是专为服务器设计的&#xff0c;它们支持多核处理&#xff0c;能够应对…

语言模型的校准技术:增强概率评估

​ 使用 DALLE-3 模型生成的图像 目录 一、说明 二、为什么校准对 LLM 模型至关重要 三、校准 LLM 概率的挑战 四、LLM 的高级校准方法 4.1 语言置信度 4.2 增强语言自信的先进技术 4.3 基于自一致性的置信度 4.4 基于 Logit 的方法 五、代理模型或微调方法 5.1 使用代…

集成算法实验与分析(软投票与硬投票)

概述 目的&#xff1a;让机器学习效果更好&#xff0c;单个不行&#xff0c;集成多个 集成算法 Bagging&#xff1a;训练多个分类器取平均 f ( x ) 1 / M ∑ m 1 M f m ( x ) f(x)1/M\sum^M_{m1}{f_m(x)} f(x)1/M∑m1M​fm​(x) Boosting&#xff1a;从弱学习器开始加强&am…

排序-插入排序与选择排序

插入排序 基本思想 把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中&#xff0c;直到所有的记录插入完为止&#xff0c;得到一个新的有序序列 。 打扑克牌整理手牌用的就是插入排序的思想 代码实现 void InsertSort(int* a, int n) { assert(a); …

C语言自定义类型

在C语言中&#xff0c;自定义类型可以通过typedef关键字来实现。typedef用于为现有的数据类型创建新的名称&#xff08;别名&#xff09;&#xff0c;使代码更清晰易读。自定义类型的一个常见用途是简化复杂的类型声明&#xff0c;特别是在使用结构体、枚举和函数指针时。 使用…

52、有边数限制的最短路

有边数限制的最短路 题目描述 给定一个n个点m条边的有向图&#xff0c;图中可能存在重边和自环&#xff0c; 边权可能为负数。 请你求出从1号点到n号点的最多经过k条边的最短距离&#xff0c;如果无法从1号点走到n号点&#xff0c;输出impossible。 注意&#xff1a;图中可…