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

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

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

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

文章目录

    • 1.题目:解释C++中的深拷贝和浅拷贝。
    • 2.题目:解释C++中的虚基类及其用途。
    • 3.题目:解释C++中的函数重载和函数覆盖的区别。
    • 4.题目:解释C++中的内存对齐及其作用。
    • 5.题目:解释C++中的内存泄漏及其检测方法。
    • 6.题目:解释C++中的虚析构函数及其用途。
    • 7.题目:解释C++中的多重继承及其优缺点。
    • 8.题目:解释C++中的函数模板和类模板。
    • 9.题目:解释C++中的运算符重载及其实现方式。
    • 10.题目:解释C++中的STL迭代器及其类型。
    • 11.题目:解释C++中的STL算法及其用途。
    • 12.题目:解释C++中的STL容器及其类型。
    • 13.题目:解释C++中的STL适配器及其用途。
    • 14.题目:解释C++中的STL函数对象及其用途。
    • 15.题目:解释C++中的STL绑定器及其用途。
    • 16.题目:解释C++中的STL仿函数及其用途。
    • 17.题目:解释C++中的STL谓词及其用途。
    • 18.题目:解释C++中的STL插入迭代器及其用途。
    • 19.题目:解释C++中的STL适配器及其用途。
    • 20.题目:解释C++中的STL函数对象及其用途。
      • 用途:
      • 示例代码:

1.题目:解释C++中的深拷贝和浅拷贝。

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

  • 浅拷贝:复制对象时,只复制对象的基本数据类型成员,对于指针成员,只复制指针的地址,不复制指针指向的内容。这样两个对象共享同一块内存。
  • 深拷贝:复制对象时,不仅复制对象的基本数据类型成员,还复制指针指向的内容。这样两个对象拥有独立的内存。
class MyClass {
public:int* data;MyClass(int value) {data = new int(value);}// 深拷贝构造函数MyClass(const MyClass& other) {data = new int(*other.data);}~MyClass() {delete data;}
};

2.题目:解释C++中的虚基类及其用途。

考点:继承
答案解析
虚基类用于解决多重继承中的菱形继承问题。通过将共同的基类声明为虚基类,可以确保在派生类中只存在一份基类的成员。

class A {
public:void show() {std::cout << "A" << std::endl;}
};class B : virtual public A {
};class C : virtual public A {
};class D : public B, public C {
};int main() {D d;d.show(); // 输出 "A"return 0;
}

3.题目:解释C++中的函数重载和函数覆盖的区别。

考点:面向对象编程
答案解析

  • 函数重载:在同一个作用域内,函数名相同但参数列表不同的多个函数。编译器根据参数列表区分不同的函数。
  • 函数覆盖:在派生类中重新定义基类中的虚函数。派生类的函数覆盖基类的虚函数,调用时根据对象的实际类型决定调用哪个函数。
class Base {
public:void func(int x) {std::cout << "Base func(int)" << std::endl;}virtual void show() {std::cout << "Base show" << std::endl;}
};class Derived : public Base {
public:void func(double x) {std::cout << "Derived func(double)" << std::endl;}void show() override {std::cout << "Derived show" << std::endl;}
};int main() {Derived d;d.func(10); // 输出 "Base func(int)"d.func(10.0); // 输出 "Derived func(double)"d.show(); // 输出 "Derived show"return 0;
}

4.题目:解释C++中的内存对齐及其作用。

考点:内存管理
答案解析
内存对齐是指将数据存储在特定的内存地址上,以提高内存访问效率。内存对齐的作用是减少CPU访问内存的次数,提高程序的执行效率。C++中可以使用#pragma pack指令来控制内存对齐。

#include <iostream>
#pragma pack(1) // 设置内存对齐为1字节struct MyStruct {char a;int b;
};int main() {std::cout << sizeof(MyStruct) << std::endl; // 输出 5return 0;
}

5.题目:解释C++中的内存泄漏及其检测方法。

考点:内存管理
答案解析
内存泄漏是指程序在动态分配内存后未能正确释放,导致内存无法被重用。常见的检测方法包括使用工具如Valgrind、AddressSanitizer等,或者在代码中使用智能指针(如std::unique_ptrstd::shared_ptr)来自动管理内存。

6.题目:解释C++中的虚析构函数及其用途。

考点:继承与多态
答案解析
虚析构函数用于在基类中定义析构函数,使得通过基类指针删除派生类对象时能够正确调用派生类的析构函数,避免内存泄漏。

class Base {
public:virtual ~Base() {std::cout << "Base destructor" << std::endl;}
};class Derived : public Base {
public:~Derived() {std::cout << "Derived destructor" << std::endl;}
};int main() {Base* b = new Derived();delete b; // 输出 "Derived destructor" 和 "Base destructor"return 0;
}

7.题目:解释C++中的多重继承及其优缺点。

考点:继承
答案解析

  • 优点:多重继承允许一个类从多个基类继承,从而可以复用多个基类的功能。
  • 缺点:多重继承可能导致二义性问题和菱形继承问题。二义性问题是指当多个基类中有同名成员时,派生类无法确定使用哪个基类的成员。菱形继承问题是指当一个类从两个基类继承,而这两个基类又从同一个基类继承时,会导致基类的成员被继承多次。
class A {
public:void show() {std::cout << "A" << std::endl;}
};class B : public A {
public:void show() {std::cout << "B" << std::endl;}
};class C : public A {
public:void show() {std::cout << "C" << std::endl;}
};class D : public B, public C {
public:void show() {B::show(); // 解决二义性问题}
};int main() {D d;d.show(); // 输出 "B"return 0;
}

8.题目:解释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();}
};

9.题目:解释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;
}

10.题目:解释C++中的STL迭代器及其类型。

考点:STL
答案解析
STL迭代器是用于遍历容器元素的对象。STL迭代器的类型包括:

  • 输入迭代器:只读,单向遍历。
  • 输出迭代器:只写,单向遍历。
  • 前向迭代器:读写,单向遍历。
  • 双向迭代器:读写,双向遍历。
  • 随机访问迭代器:读写,支持随机访问。
#include <iostream>
#include <vector>int main() {std::vector<int> vec = {1, 2, 3, 4, 5};std::vector<int>::iterator it;for (it = vec.begin(); it != vec.end(); ++it) {std::cout << *it << " ";}return 0;
}

11.题目:解释C++中的STL算法及其用途。

考点:STL
答案解析
STL算法是用于操作容器元素的函数。常见的STL算法包括:

  • std::sort:对容器元素进行排序。
  • std::find:在容器中查找指定元素。
  • std::for_each:对容器中的每个元素执行指定操作。
  • std::copy:将容器元素复制到另一个容器中。
#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> vec = {5, 3, 1, 4, 2};std::sort(vec.begin(), vec.end());for (int x : vec) {std::cout << x << " ";}return 0;
}

12.题目:解释C++中的STL容器及其类型。

考点:STL
答案解析
STL容器是用于存储和管理数据的类。STL容器的类型包括:

  • 顺序容器:如std::vectorstd::liststd::deque等。
  • 关联容器:如std::setstd::mapstd::multisetstd::multimap等。
  • 无序容器:如std::unordered_setstd::unordered_mapstd::unordered_multisetstd::unordered_multimap等。
#include <iostream>
#include <vector>
#include <set>int main() {std::vector<int> vec = {1, 2, 3, 4, 5};std::set<int> s = {5, 4, 3, 2, 1};for (int x : vec) {std::cout << x << " ";}std::cout << std::endl;for (int x : s) {std::cout << x << " ";}return 0;
}

13.题目:解释C++中的STL适配器及其用途。

考点:STL
答案解析
STL适配器是用于改变容器、迭代器或函数对象行为的类。常见的STL适配器包括:

  • 容器适配器:如std::stackstd::queuestd::priority_queue等。
  • 迭代器适配器:如std::reverse_iteratorstd::back_insert_iteratorstd::front_insert_iterator等。
  • 函数适配器:如std::bindstd::function等。
#include <iostream>
#include <stack>int main() {std::stack<int> s;s.push(1);s.push(2);s.push(3);while (!s.empty()) {std::cout << s.top() << " ";s.pop();}return 0;
}

14.题目:解释C++中的STL函数对象及其用途。

考点:STL
答案解析
STL函数对象是重载了operator()的类或结构体,可以像函数一样调用。函数对象可以携带状态,适用于需要状态的场景。常见的STL函数对象包括std::plusstd::minusstd::multipliesstd::divides等。

#include <iostream>
#include <functional>int main() {std::plus<int> add;std::cout << add(3, 4) << std::endl; // 输出 7return 0;
}

15.题目:解释C++中的STL绑定器及其用途。

考点:STL
答案解析
STL绑定器用于将函数对象的参数绑定到特定值,从而生成新的函数对象。常见的STL绑定器包括std::bind1ststd::bind2ndstd::bind等。

#include <iostream>
#include <functional>int main() {auto add_five = std::bind(std::plus<int>(), std::placeholders::_1, 5);std::cout << add_five(10) << std::endl; // 输出 15return 0;
}

16.题目:解释C++中的STL仿函数及其用途。

考点:STL
答案解析
STL仿函数是重载了operator()的类或结构体,可以像函数一样调用。仿函数可以携带状态,适用于需要状态的场景。常见的STL仿函数包括std::lessstd::greaterstd::equal_to等。

#include <iostream>
#include <functional>int main() {std::less<int> less_than;std::cout << less_than(3, 4) << std::endl; // 输出 1 (true)return 0;
}

17.题目:解释C++中的STL谓词及其用途。

考点:STL
答案解析
STL谓词是返回布尔值的函数对象。根据参数个数,谓词分为一元谓词和二元谓词。常见的STL谓词包括std::lessstd::greaterstd::equal_to等。

#include <iostream>
#include <algorithm>
#include <vector>int main() {std::vector<int> vec = {1, 2, 3, 4, 5};auto it = std::find_if(vec.begin(), vec.end(), std::bind2nd(std::greater<int>(), 3));if (it != vec.end()) {std::cout << *it << std::endl; // 输出 4}return 0;
}

18.题目:解释C++中的STL插入迭代器及其用途。

考点:STL
答案解析
STL插入迭代器用于在容器中插入元素。常见的STL插入迭代器包括std::back_insert_iteratorstd::front_insert_iteratorstd::insert_iterator等。

#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>int main() {std::vector<int> vec1 = {1, 2, 3};std::vector<int> vec2 = {4, 5, 6};std::copy(vec2.begin(), vec2.end(), std::back_inserter(vec1));for (int x : vec1) {std::cout << x << " ";}return 0;
}

19.题目:解释C++中的STL适配器及其用途。

考点:STL
答案解析
STL适配器是用于改变容器、迭代器或函数对象行为的类。常见的STL适配器包括:

  • 容器适配器:如std::stackstd::queuestd::priority_queue等。
  • 迭代器适配器:如std::reverse_iteratorstd::back_insert_iteratorstd::front_insert_iterator等。
  • 函数适配器:如std::bindstd::function等。
#include <iostream>
#include <stack>int main() {std::stack<int> s;s.push(1);s.push(2);s.push(3);while (!s.empty()) {std::cout << s.top() << " ";s.pop();}return 0;
}

20.题目:解释C++中的STL函数对象及其用途。

考点:STL
答案解析
STL函数对象(也称为仿函数)是重载了operator()的类或结构体,可以像函数一样调用。函数对象可以携带状态,适用于需要状态的场景。常见的STL函数对象包括std::plusstd::minusstd::multipliesstd::divides等。

用途:

  1. 携带状态:函数对象可以保存状态信息,这在需要状态的场景中非常有用。例如,可以创建一个函数对象来计数某个操作的执行次数。
  2. 灵活性:函数对象可以通过构造函数传递参数,从而在调用时使用这些参数。这使得函数对象比普通函数指针更灵活。
  3. 性能优化:由于函数对象是类的实例,编译器可以对其进行内联优化,从而提高性能。
  4. 与STL算法结合使用:STL算法(如std::sortstd::for_each等)通常接受函数对象作为参数,从而实现自定义的操作。

示例代码:

#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>// 自定义函数对象
class Increment {
public:Increment(int n) : num(n) {}int operator()(int x) const {return x + num;}
private:int num;
};int main() {std::vector<int> vec = {1, 2, 3, 4, 5};Increment inc(5);// 使用自定义函数对象std::transform(vec.begin(), vec.end(), vec.begin(), inc);for (int x : vec) {std::cout << x << " "; // 输出 "6 7 8 9 10"}std::cout << std::endl;// 使用STL提供的函数对象std::plus<int> add;std::cout << add(3, 4) << std::endl; // 输出 7return 0;
}

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

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

相关文章

C++中的模板---下

一&#xff0c;非类型模板参数 模板参数分类类型形参与非类型形参 类型形参即&#xff1a;出现在模板参数列表中&#xff0c;跟在class或者typename之类的参数类型名称 非类型形参&#xff0c;就是用一个常量作为类(函数)模板的一个参数&#xff0c;在类(函数)模板中可将该参…

数据加密验签机的工作原理

数据加密验签机&#xff0c;作为网络安全领域的关键设备&#xff0c;其重要性不言而喻。以下是对数据加密验签机的详细介绍&#xff1a; 一、引言 在数字化时代&#xff0c;数据的机密性、完整性和真实性是企业和个人都极为关注的问题。数据加密验签机&#xff0c;正是为了解决…

Java(三)选择与循环

在一个程序执行的过程中&#xff0c;各条语句的执行顺序对程序的结果是有直接影响的。所以&#xff0c;我们必须清楚每条语句的执行流程。而且&#xff0c;很多时候要通过控制语句的执行顺序来实现我们想要的功能。 一、引言 如果我们要写一个计算圆的面积的程序&#xff0c;…

RPC RMI 区别以及在java中的应用

文章目录 1. 简介1.1 什么是RPC1.2 什么是RMI 2. RPC与RMI的区别2.1 RPC和RMI的优缺点对比RPC的优点RPC的缺点RMI的优点RMI的缺点 2.2 选择RPC还是RMI&#xff1f;应用场景和考虑因素选择RPC的场景选择RMI的场景 3. RPC在Java框架中的应用3.1 Java中常用的RPC框架3.2 RPC在Java…

【学术小白成长之路】02三方演化博弈(基于复制动态方程)期望与复制动态方程

从本专栏开始&#xff0c;笔者正式研究演化博弈分析&#xff0c;其中涉及到双方演化博弈分析&#xff0c;三方演化博弈分析&#xff0c;复杂网络博弈分析等等。 先阅读了大量相关的博弈分析的文献&#xff0c;总结了现有的研究常用的研究流程&#xff0c;针对每个流程进行拆解。…

C++设计模式-生产者消费者模式

运行在VS2022&#xff0c;x86&#xff0c;Debug下。 32. 生产者消费者模式 解耦生产者和消费者之间的关系&#xff0c;即生产者和消费者只依赖缓冲区&#xff0c;而不相互依赖。应用&#xff1a;多线程并发编程&#xff0c;可以解决生产者和消费者之间的同步问题。实现 生产者…

Dubbo 3.x源码(21)—Dubbo服务引用源码(4)

基于Dubbo 3.1&#xff0c;详细介绍了Dubbo服务的发布与引用的源码。 此前我们学习了createInvokerForRemote方法中的Wrapper有哪些以及作用&#xff0c;接下来我们将会的学习真正的本地、应用级别、接口级别的Protocol的引入逻辑&#xff0c;以及创建Proxy服务接口代理对象的逻…

分享不用会员免费听歌的软件,可听付费,支持随听随下!

今天来点特别的&#xff0c;给你们带来几款全网免费听歌的神器&#xff0c;让你们的音乐之旅不再有障碍&#xff01; 现在&#xff0c;找好听的歌越来越像寻宝一样&#xff0c;动不动就得掏腰包。不过别担心&#xff0c;阿星今天就来分享几款好用的免费听歌app&#xff0c;电脑…

六、【源码】SQL执行器的定义和实现

源码地址&#xff1a;https://github.com/mybatis/mybatis-3/ 仓库地址&#xff1a;https://gitcode.net/qq_42665745/mybatis/-/tree/06-sql-executor SQL执行器的定义和实现 之前的Sql执行都是耦合在SqlSession里的&#xff0c;现在要对这部分进行解耦和重构&#xff0c;引…

【MySQL】(基础篇四) —— 检索数据

检索数据 检索数据是我们使用数据库时进行最多的操作&#xff0c;其中包括了检索条件、排序、过滤、分组等等。我会在后续的多篇博客中为你进行详细地介绍它们。 这次先让我们来粗略的了解一下SELECT&#xff0c;为了使用SELECT检索表数据&#xff0c;必须至少明确两点信息—…

【JsDoc】JsDoc用法 | 巧妙用法

type type {other} other 接收表达式或字符 1、数组代码提示 1、效果图 1、码 /*** type {Array.<play|paush|next>} */ let music []2、字符串提示 2、效果图 2、码 /*** type {a|b|c}*/ let str

大模型PEFT(二) 之 大模型LoRA指令微调实践

环境搭建 git clone -b v0.6.1 --depth1 https://github.com/hiyouga/LLaMA-Factory.gitcd LLaMA-Factoryconda create -n py310 python3.10 source activate py310pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple --ignore-installed疑问 !git…

项目-五子棋双人对战:游戏房间的管理(5)

完整代码见: 邹锦辉个人所有代码: 测试仓库 - Gitee.com 之前我们已经实现了玩家匹配的功能, 我们都知道, 匹配完过后就可以进入游戏房间进行对战了, 所以我们下一步关注的重点就是对于游戏房间的管理. 模块详细讲解 功能需求 通过匹配的方式, 自动给玩家加入到一个游戏房间…

atomic特质的局限性

为什么在实际的 Objective-C 开发中, 几乎所有的属性都声明为 nonatomic ? 声明为 atomic 的属性我是真的没见过 在实际的 Objective-C 开发中&#xff0c;大多数属性通常声明为 nonatomic&#xff0c;主要原因包括性能考虑和常见的设计模式。具体原因如下&#xff1a; 性能问…

java-集合使用 3

TreeSet 类 TreeSet 类是基于红黑树的数据结构实现的&#xff0c;主要特点如下&#xff1a; - 不允许包含重复元素&#xff1b; - 允许使用 null 值&#xff1b; - 线程不安全&#xff1b; - 插入和删除速度较慢&#xff0c;但查询速度快&#xff0c;可以对元素进行排序。 示例…

JAVA java8中内置的四大核心接口

Consumer:消费型接口 方法&#xff1a;void accept(T t) private static void test01(){happy(50000,(money)-> System.out.println("zrx将来月薪"money"元"));}public static void happy(double money, Consumer<Double> com){com.accept(money…

20240606更新Toybrick的TB-RK3588开发板在Android12下的内核

20240606更新Toybrick的TB-RK3588开发板在Android12下的内核 2024/6/6 10:51 0、整体编译&#xff1a; 1、cat android12-rk-outside.tar.gz* | tar -xzv 2、cd android12 3、. build/envsetup.sh 4、lunch rk3588_s-userdebug 5、./build.sh -AUCKu -d rk3588-toybrick-x0-a…

Clo3D导出服装动画,使用Unity3D展示

1.前言 Clo3D是一款应用于时装行业的3D服装设计软件,其强大的布料模拟算法可在3D空间中实现设计、制版、试衣和走秀,大幅提升数字作品逼真度和制作效率。为了让服装动画效果展示在Unity3D上模拟效果&#xff0c;需要Clo3D模拟出逼着的衣服动画。总体流程为Clo3D - Mixamo -Blen…

登Cell Press子刊,武汉理工大学团队基于集成学习提出简化电化学模型,0.17s完成3500s的1C恒流放电

2022 年 7 月&#xff0c;不老男神林志颖突发车祸&#xff0c;作为专业赛车手的他驾驶的特斯拉 Model X 在行驶过程中忽然偏离既定轨迹&#xff0c;一头撞向路边的隔离带&#xff0c;随后车辆起火&#xff0c;并在救援车拖吊过程中二次起火&#xff0c;最终整辆车被烧到只剩下了…

【ai】Audio2Face

Audio2Face 简介 Audio2Face是英伟达Omniverse平台的一部分,它使用先进的AI技术来生成基于音频输入的逼真面部动画。这个技术主要利用深度学习模型来解析人声,进而驱动一个三维模型的面部表情。下面是Audio2Face工作流程的详细说明: 预备阶段 在使用Audio2Face之前,需要准…