C++面试准备一(常考)

一、C++中静多态和动多态的区别

在 C++ 里,多态是一个关键特性,它允许你以统一的方式处理不同类型的对象。多态可分为静多态和动多态,下面为你详细介绍:

静多态

静多态也叫编译时多态,其在编译阶段就确定要调用的函数。静多态主要借助函数重载和模板来实现。

函数重载

函数重载指的是在同一作用域内定义多个同名函数,但这些函数的参数列表不同。编译器会依据调用时传入的参数类型和数量,在编译阶段确定要调用的具体函数。

#include <iostream>
using namespace std;
// 函数重载示例
int add(int a, int b) {return a + b;
}double add(double a, double b) {return a + b;
}int main() {int result1 = add(1, 2);double result2 = add(1.5, 2.5);cout << "Result1: " << result1 << endl;cout << "Result2: " << result2 << endl;return 0;
}
模板

模板是 C++ 的一种强大特性,它能够编写通用的代码,在编译时依据实际使用的类型生成具体的代码。

#include <iostream>
using namespace std;
// 模板示例
template <typename T>
T add(T a, T b) {return a + b;
}int main() {int result1 = add(1, 2);double result2 = add(1.5, 2.5);cout << "Result1: " << result1 << endl;cout << "Result2: " << result2 << endl;return 0;
}

动多态

动多态也叫运行时多态,它在运行阶段才确定要调用的函数。动多态主要通过虚函数和继承来实现。

#include <iostream>
using namespace std;// 基类
class Shape {
public:// 虚函数virtual void draw() {cout << "Drawing a generic shape." << endl;}
};// 派生类
class Circle : public Shape {
public:void draw() override {cout << "Drawing a circle." << endl;}
};// 派生类
class Square : public Shape {
public:void draw() override {cout << "Drawing a square." << endl;}
};int main() {Circle circle;Square square;// 基类指针指向派生类对象Shape* shape1 = &circle;Shape* shape2 = &square;// 运行时确定调用的函数shape1->draw();shape2->draw();return 0;
}
两者的区别:

绑定时间:静多态在编译阶段完成绑定,动多态在运行阶段完成绑定
性能:静多态由于在编译阶段就确定调用的函数,所以没有额外的运行时开销;而动多态需要在运行时查找虚函数表,会有一些性能损失。
灵活性:动多态更灵活,能在运行时依据对象的实际类型来确定调用的函数;静多态则需要在编译时就明确类型。

二、C++中的空类默认产生哪些成员函数

在C++中,当你定义一个空类,编译器会为这个类自动地生成一些特殊的成员函数。这些成员函数通常被称为“编译器生成的成员函数”或“默认成员函数”。以下是这些成员函数:

1、默认构造函数 (Default Constructor):

如果你没有为类定义任何构造函数,编译器会为你生成一个默认构造函数。这个构造函数不接受任何参数,并且不执行任何操作(除了可能的内存初始化,这取决于编译器和编译选项)。

2、 析构函数

析构函数在对象生命周期结束时被调用,负责释放对象占用的资源。如果没有显式定义析构函数,编译器会生成默认析构函数,其函数体为空。

3、拷贝构造函数

拷贝构造函数 (Copy Constructor): 这个构造函数用于创建一个新对象,作为现有对象的副本。如果你没有定义拷贝构造函数,编译器会为你生成一个。

4、拷贝赋值运算符

拷贝赋值运算符用于将一个对象的值赋给另一个已存在的对象。若没有显式定义拷贝赋值运算符,编译器会生成默认拷贝赋值运算符,它同样会按成员逐个复制对象的数据。

5、移动构造函数 (Move Constructor) 和 移动赋值运算符 (Move Assignment Operator):

从C++11开始,编译器还会为类生成移动构造函数和移动赋值运算符(如果类中有指针成员或可以高效移动的资源)。这些函数用于支持对象的移动语义,而不是传统的拷贝语义。

移动构造函数用于将一个临时对象的资源转移到新对象,避免不必要的拷贝操作。如果没有显式定义移动构造函数,编译器会在满足一定条件时生成默认移动构造函数。

class EmptyClass {
public:// 默认移动构造函数EmptyClass(EmptyClass&& other) noexcept {// 转移资源}
};

移动赋值运算符用于将一个临时对象的资源转移到已存在的对象,避免不必要的拷贝操作。如果没有显式定义移动赋值运算符,编译器会在满足一定条件时生成默认移动赋值运算符。

class EmptyClass {
public:// 默认移动赋值运算符EmptyClass& operator=(EmptyClass&& other) noexcept {if (this != &other) {// 转移资源}return *this;}
};

需要注意的是,这些编译器生成的函数通常是隐式的,也就是说,它们不会在代码中明确地出现。然而,你可以通过定义你自己的版本来覆盖它们。此外,在某些情况下(例如,当类中有引用成员或删除的函数时),编译器可能不会生成所有这些函数。

三、C++中抽象类定义接口的好处:

1.明确约定与规范:

通过定义抽象类,可以明确地指定一个类应该提供哪些功能,即定义了一个接口。这使得其他类在实现这个接口时,必须遵循一定的规范,实现特定的方法或属性。这有助于保证代码的清晰性和一致性,使得不同开发者之间的合作更加顺畅。

2、多态性的基础:

抽象类是实现多态性的重要手段之一。通过基类的指针或引用,可以指向派生类的对象,并调用其实现的接口方法。这种机制使得程序在运行时能够根据对象的实际类型来执行相应的操作,从而增强了程序的灵活性和扩展性。

3、隐藏实现细节:

抽象类只定义了接口,而不关心具体的实现细节。这使得使用者只需关心接口提供的功能,而无需了解底层的实现细节。这有助于降低代码的耦合度,提高代码的可维护性和可重用性。

4、强制实现:

当一个类继承自抽象类时,它必须提供抽象类中所有纯虚函数的实现。这确保了派生类不会遗漏任何必要的功能,从而提高了代码的可靠性。

5、代码复用:

通过继承抽象类,多个派生类可以共享相同的接口,从而实现了代码的复用。这避免了在多个类中重复编写相同的代码,提高了开发效率。

6、易于扩展:

当需要添加新功能时,只需在抽象类中新增一个纯虚函数,并要求所有派生类实现它即可。这样,所有使用基类指针或引用的代码都可以无缝地支持新功能,而无需修改现有代码。

四、指针和引用的区别

C语言有指针,C++兼容C,所以C++也有指针,但指针使用起来较为复杂,容易出错,C++发明一个更好用的引用.引用可能是通过指针来实现的,但它比指针简单,使用也更方便,在C++中尽量避免使用指针,可以使用引用,智能指针或容器来替代指针.
具体区别如下:
1.引用在定义时必须初始化,而指针不必须.
2.指针的指向可以改变,而引用不能修改.(注意值可以改)
3.sizeof大小不同.

sizeof(指针)在32位平台4字节,64位平台8字节;
sizeof(引用)就是求这个变量本身的字节数.

4.有空指针和野指针,但没有空引用.所以引用相对更安全.

五、内联函数和宏的区别

  1. 内联函数在运行时可以调试,宏不能
  2. 编译器会对内联函数进行自动检查,而宏不能
  3. 内联函数可以访问类的成员变量,宏不能。
  4. 在类中声明的同时定义的函数,可以自动转化为内联函数。
  5. 内联函数增加了安全性,和效率。Assert是宏不是函数
  6. 如果函数体内代码较长,不宜使用内联函数。函数体内如果有循环也不使用,开销比调用函数的大。
const和宏的区别:

const是在堆栈分配空间,而宏是直接传递到变量本身,生命周期在编译阶段。const常量存在于程序的数据段,#define常量存在于程序的代码段。
Typedef和宏的区别:

前者增加了可读性,在编译阶段,只是起了一个别名,后者只是宏替换,发生在预编译阶段

六、sizeof一个空类是多少,含有普通成员函数呢,含有虚函数呢,含有static函数或者static变量呢?

答:

  1. 空类至少有一个字节的空间,类要实例化,必须有地址,所以隐含了一个地址。也是为了方便寻址。
  2. 普通成员函数不会影响类的大小。因为普通成员函数是类的一部分,其代码存于代码段,而非对象的内存空间里。含有普通成员函数后:还是1
  3. 含有虚函数是4个字节(32位)(或8个字节(64位),根据平台的大小而定),因为有虚函数表指针。这是因为编译器会为包含虚函数的类创建一个虚函数表(VTable),并且在每个对象里添加一个指向虚函数表的指针(vptr)。在 32 位系统中,指针大小为 4 字节;在 64 位系统中,指针大小为 8 字节。
  4. static静态函数和static静态变量也不影响类的大小。静态成员函数和静态成员变量不属于类的对象,而是属于类本身。它们存储在全局数据区,并非对象的内存空间里。所以,含有静态成员函数或静态成员变量的类的大小和空类相同,至少为 1 字节。

以上为 第一部分的C++方向面试常考题目,如果觉得有帮助可以点赞支持一下,会持续更新输出有用的内容,感兴趣可以关注我!

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

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

相关文章

Model Context Protocol:下一代AI系统集成范式革命

在2023年全球AI工程化报告中,开发者面临的核心痛点排名前三的分别是:模型与业务系统集成复杂度(58%)、上下文管理碎片化(42%)、工具调用标准化缺失(37%)。传统API集成模式在对接大语言模型时暴露明显短板:RESTful接口无法承载动态上下文,GraphQL缺乏工具编排能力,gR…

多模态大模型常见问题

1.视觉编码器和 LLM 连接时&#xff0c;使用 BLIP2中 Q-Former那种复杂的 Adaptor 好还是 LLaVA中简单的 MLP 好&#xff0c;说说各自的优缺点&#xff1f; Q-Former&#xff08;BLIP2&#xff09;&#xff1a; 优点&#xff1a;Q-Former 通过查询机制有效融合了视觉和语言特征…

EasyRTC轻量级Webrtc音视频通话SDK,助力带屏IPC在嵌入式设备中的应用

一、市场背景 随着人们生活水平的提高&#xff0c;对于家居安全和远程监控的需求日益增长&#xff0c;带屏IPCam不仅满足了用户实时查看监控画面的需求&#xff0c;还提供了诸如双向语音通话、智能报警等丰富的功能&#xff0c;极大地提升了用户体验。 此外&#xff0c;技术的…

Linux安装JDK

1、下载JDK https://www.oracle.com/cn/java/technologies/downloads/#java11 2、安装 2.1、创建安装目录 mkdir /usr/local/jdk 2.1、将下载的tar.gz上传到服务器 使用tar -zxvf jdk-8u311-linux-x64.tar.gz解压后剪切到 /usr/local/jdk目录&#xff1a;mv xxx /usr/local/j…

基于基于eFish-SBC-RK3576工控板的智慧城市边缘网关

此方案充分挖掘eFish-SBC-RK3576的硬件潜力&#xff0c;可快速复制到智慧园区、交通枢纽等场景。 方案亮点 ‌接口高密度‌&#xff1a;单板集成5GWiFi多路工业接口&#xff0c;减少扩展复杂度。‌AIoT融合‌&#xff1a;边缘端完成传感器数据聚合与AI推理&#xff0c;降低云端…

CSS 学习笔记 - 蓝桥杯重点整理

1. CSS 基础语法 核心知识点 选择器 声明块结构三种引入方式&#xff1a;行内/内部/外部常用选择器类型&#xff1a;标签/类/ID/通配符 <!-- 行内样式 --> <p style"color: red;">红色文字</p><!-- 内部样式 --> <style>/* 标签选…

UML的使用

process on 在线使用 UML概念 UML &#xff1a;统一建模语言(Unified Modeling Language&#xff0c;是用来设计软件的可视化建模语言。 1. 类图 1.1 概念 类图&#xff08;Class Diagram&#xff09;是UML中用于描述系统静态结构的图形化工具。它展示了系统的类、接口、它…

【C++】入门

1.命名空间 1.1 namespace的价值 在C/C中&#xff0c;变量&#xff0c;函数和后面要学到的类都是大量存在的&#xff0c;这些变量&#xff0c;函数和类的名称将存在于全局作用域中&#xff0c;可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化&#xff0c;…

数据库练习2

目录 1.向heros表中新增一列信息&#xff0c;添加一些约束&#xff0c;并尝试查询一些信息 2.课堂代码练习 插入语句 INSERT INTO 删除语句DELETE和TRUNCATE 更新语句UPDATE和replace 查询语句SELECT 条件查询 查询排序 聚合函数 分组查询 3.题目如下 一、单表查询 …

w266农产品直卖平台的设计与实现

&#x1f64a;作者简介&#xff1a;多年一线开发工作经验&#xff0c;原创团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339;赠送计算机毕业设计600个选题excel文…

2025新版懒人精灵零基础安装调试+lua基础+UI设计交互+常用方法封装+项目实战+项目打包安装板块-视频教程(初学者必修课)

2025新版懒人精灵零基础安装调试lua基础UI设计交互常用方法封装项目实战项目打包安装板块-视频教程(初学者必修课)&#xff1a; 1.懒人精灵核心API基础和lua基础视频教程&#xff1a;https://www.bilibili.com/video/BV1Vm9kYJEfM/ 温馨提示&#xff1a;所有视频请用电脑浏览…

CCF-CSP认证 202206-2寻宝!大冒险!

题目描述 思路 有一张绿化图和藏宝图&#xff0c;其中绿化图很大&#xff08;二维数组在限定的空间内无法存储&#xff09;&#xff0c;而藏宝图是绿化图中的一部分&#xff0c;对于绿化图和藏宝图&#xff0c;左下角的坐标为(0, 0)&#xff0c;右上角的坐标是(L, L)、(S, S)&…

Qt下集成大华网络相机SDK示例开发

文章目录 前言一、下载并集成大华网络相机SDK二、示例实现功能三、示例完整代码四、下载链接总结 前言 近期在Qt环境下进行大华网络相机的使用&#xff0c;发现官网下载的SDK中提供的示例没有Qt的demo&#xff0c;通过学习其提供的MFC示例代码&#xff0c;我在这里也实现了一个…

[学习笔记] 部署Docker搭建靶场

前言 我们需要部署Docker来搭建靶场题目&#xff0c;他可以提供一个隔离的环境&#xff0c;方便在不同的机器上部署&#xff0c;接下来&#xff0c;我会记录我的操作过程&#xff0c;简单的部署一道题目 Docker安装 不推荐在物理机上部署&#xff0c;可能会遇到一些问题&…

网络华为HCIA+HCIP IPv6

目录 IPv4现状 IPv6基本报头 IPv6扩展报头 IPv6地址 IPv6地址缩写规范 ​编辑 IPv6地址分配 IPv6单播地址分配 IPv6单播地址接口标识 IPv6常见单播地址 - GUA &#xff08;2 / 3 开头&#xff09; IPv6常见单播地址 - ULA IPv6常见单播地址 - LLA IPv6组播地…

可视化动态表单动态表单界的天花板--Formily(阿里开源)

文章目录 1、Formily表单介绍2、安装依赖2.1、安装内核库2.2、 安装 UI 桥接库2.3、Formily 支持多种 UI 组件生态&#xff1a; 3、表单设计器3.1、核心理念3.2、安装3.3、示例源码 4、场景案例-登录注册4.1、Markup Schema 案例4.2、JSON Schema 案例4.3、纯 JSX 案例 1、Form…

C++::多态

目录 一.多态的概念 二.多态的定义及实现 二.1多态的构成条件 二.2虚函数 1.虚函数的写法 2.虚函数的重写/覆盖 3.协变 二.3析构函数的重写 二.4override和final关键字 ​编辑二.5重载/重写/隐藏的对比 三.多态的运行原理&#xff08;一部分&#xff09; 四.多态的常…

Mistral AI发布开源多模态模型Mistral Small 3.1:240亿参数实现超越GPT-4o Mini的性能

法国人工智能初创公司Mistral AI于2025年3月正式推出新一代开源模型Mistral Small 3.1 &#xff0c;该模型凭借240亿参数的轻量级设计&#xff0c;在多项基准测试中表现优异&#xff0c;甚至超越了Google的Gemma 3和OpenAI的GPT-4o Mini等主流专有模型。 1、核心特性与优势 多…

从零开发数据可视化

一、可视化模版展示 二、知识及素材准备 div css 布局flex布局Less原生js jquery 的使用rem适配echarts基础 相关js、images、font百度网盘下载链接&#xff1a; 通过百度网盘分享的文件&#xff1a;素材1 链接: https://pan.baidu.com/s/1vmZHbhykcvfLzzQT5USr8w?pwdwjx9…

WSL git文件异常 所有文件均显示已修改

如图&#xff0c;文件中没有任何修改&#xff0c;但是都显示多了一个^M 原因&#xff1a;是因为在Windows系统中git clone的文件夹&#xff0c;在WSL中会显示冲突。 解决方案&#xff1a;删掉之前在windows下git clone的文件夹&#xff0c; 然后在WSL中重新git clone