【C++】面试题整理(未完待续)

news2025/1/17 10:49:35

【C++】面试题整理

文章目录

    • 一、概述
    • 二、C++基础
      • 2.1 - 指针在 32 位和 64 位系统中的长度
      • 2.2 - 数组和指针
      • 2.3 - 结构体对齐补齐
      • 2.4 - 头文件包含
      • 2.5 - 堆和栈的区别
      • 2.6 - 宏函数比较两个数值的大小
      • 2.7 - 冒泡排序
      • 2.8 - 菱形继承的内存布局
      • 2.9 - 继承重写
      • 2.10 - 如何禁止类在栈上分配内存
    • 三、智能指针
      • 3.1 - 智能指针是线程安全的吗?
      • 3.2 - 线程安全的几种方法
    • 四、 STL
      • 4.1 - map 删除
    • 五、参考

一、概述

最近面试,感觉有些比较基础的好久不用就有些生疏了,整理一下。

【备注】:题目的答案是个人整理的不能保证是标准答案。

二、C++基础

2.1 - 指针在 32 位和 64 位系统中的长度

4 字节和 8 字节

32/8 = 4
64/8 = 8

2.2 - 数组和指针

以下代码在 32 位和 64 位系统中分别打印什么?

char a[] = "123456789";
const char* b = "123456789";
std::cout << sizeof(a) << std::endl;
std::cout << sizeof(b) << std::endl;
  • 32位打印: 10 和 4
  • 64位打印: 10 和 8

指针已经在第一题中说过了,就不重复了。char 数组的大小需要加上最后的 \0

2.3 - 结构体对齐补齐

在 32 位和 64 位系统中分别是多少

struct M
{
	int a;
	double b;
};

printf("%d", sizeof(struct M));

答案: 均为16,这里是结构体的对齐补齐,与系统位数无关。

2.4 - 头文件包含

两种包含头文件的区别

#include <stdio.h>
#include "stdio.h"
  • 尖括号,编译器会从系统目录中查找;
  • 双引号,编译器会首先从当前项目目录查找,找不到再去系统目录中查找。

虽然#include"“的查找范围更广,但是这并不意味着,不论是系统头文件,还是自定义头文件,一律用#include”“包含。因为#include”"的查找顺序存在先后关系,如果项目当前目录或者引用目录下存在和系统目录下重名的头文件,那么编译器在当前目录或者引用目录查找成功后,将不会继续查找,所以存在头文件覆盖的问题。另外,对于系统头文件,用#include<>包含,查找时一步到位,程序编译时的效率也会相对更高。

2.5 - 堆和栈的区别

  • 堆(heap): 向上增长内存,存储动态分配的内存,需要程序员自己管理,分配和释放。
  • 栈(stack): 向下增长内存,存储静态分配的内存,系统会自动释放。

2.6 - 宏函数比较两个数值的大小

要求不使用大于、小于和if

#define MAX(a,b) (int)((a)/(b)) == 0 ? (a) : (b);

定义宏函数需要注意,入参需要使用小括号括起来,避免传入算式导致预期外的计算

MAX(4-1,5); 
// 不加小括号 4 - 1/5 = 3 返回3 值错误。
// 加小括号 (4-1)/(5) = 0, 返回值为 5。

2.7 - 冒泡排序

void bubbleSort(int arr*, int n)
{
	for (int i = 0; i < n - 1; ++i)
	{
		for (int j = 0; j < n - i - 1; ++j)
		{
			if (arr[j] > arr[j+1])
			{
				int tmp = arr[j];
				arr[j] = arr[j+1];
				arr[j+1] = arr[j];
			}
		}
	}
}

如果我是面试官,我会在这里考一个打印 arr 的 sizeof ,因为 数组在传参时会退化为指针。

2.8 - 菱形继承的内存布局

class A
{
public:
    int a;
};

class B : public A
{
public:
    int b;
};

class C : public A
{
public:
    int c;
};

class D : public B, public C
{
public:
    int d;
};

可以看到 A 中的内容被重复记录了两次

若改为虚继承,虚继承是为了解决冗余和二义性

class B : virtual public A {/*...*/};
class C : virtual public A {/*...*/};

在这里插入图片描述
则会出现一个虚基表指针 vbptr (virtual base pointer) 记录偏移

VS Developer Command Prompt 查看内存布局方法
cl /d1 reportSingleClassLayoutD filename.cpp

2.9 - 继承重写

实现一个 Shape 类,定义纯虚函数 area,定义 Rectangle 和 Circle 类继承 Shape 类,在main函数中打印面积。

class Shape
{
public:
	virtual double area() = 0;
};

class Rectangle : public Shape
{
public: 
	Rectangle(double width, double length):
		m_width(width), m_length(length) {}
	virtual double area() override
	{
		return m_width*m_length;
	}
private:
	double m_width {0.0};
	double m_length {0.0};	
};
#define PI 3.1415926
class Circle  : public Shape
{
public:
	Circle(double radius): m_radius(radius)
	{}
	virtual double area() override
	{
		return PI * m_radius * m_radius
	}
private:
	double m_radius{0.0};	
};

调用

#include <iostream>
int main(int argc, char* argv[])
{
	Rectangle rect(3.0, 4.0);
	Circle c(2.0);
	std::cout << rect.area() << std::endl;
	std::cout << c.area() << std::endl;
}

2.10 - 如何禁止类在栈上分配内存

其实只要禁用 析构就可以在编译时报错,但是为了方便继承和使用

class A 
{
public:
	static A* Create(){ return new A();}
	void Destroy() { delete this;} // 不能为 static,因为静态函数中无 this 指针
protected:
	~A() {};
	A() {};
	A(const A& rhs) {/*...*/};
	A(const A&& rhs) {/*...*/};
	const A& operator=(const A& rhs) {/*...*/};
	const A& operator=(const A&& rhs) {/*...*/};
};

三、智能指针

3.1 - 智能指针是线程安全的吗?

不是,虽然引用计数是原子操作,但还有其他的操作

3.2 - 线程安全的几种方法

  • 加锁
  • 原子变量 std::atomic

四、 STL

4.1 - map 删除

改错。

using std::map;
using std::string;
int main(int argc, char* argv[])
{
    map<string, string> mapData;
    
    mapData["a"] = "aaa"; 
    mapData["b"] = "bbb"; 
    mapData["c"] = "ccc"; 

    for (map<string, string>::iterator i=mapData.begin(); i!=mapData.end(); i++)
    {
        if (i->first == "b")
        {
            mapData.erase(i);
        }
    }
    return 0;
}

错误是容器删除元素会有迭代器失效,网上给的改错方式是,将for循环 i++ 删除 加到函数中

for (map<string, string>::iterator i=mapData.begin(); i!=mapData.end(); /*i++*/)
{
    if (i->first == "b")
    {
        mapData.erase(i++);
    }
    else
    {
    	i++;
    }
}

个人感觉这样也可以

for (map<string, string>::iterator i=mapData.begin(); i!=mapData.end();++i)
{
    if (i->first == "b")
    {
        i = mapData.erase(i);
        --i;
    }  
}

五、参考

  • https://blog.csdn.net/rammuschow/article/details/107947302 include
  • https://en.cppreference.com/w/cpp/container/map/erase std::map erase 函数
  • https://blog.csdn.net/AgoniAngel/article/details/105893798 菱形继承内存分布

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

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

相关文章

ASP.NET Core - 依赖注入(四)

ASP.NET Core - 依赖注入&#xff08;四&#xff09; 4. ASP.NET Core默认服务5. 依赖注入配置变形 4. ASP.NET Core默认服务 之前讲了中间件&#xff0c;实际上一个中间件要正常进行工作&#xff0c;通常需要许多的服务配合进行&#xff0c;而中间件中的服务自然也是通过 Ioc…

w~Transformer~合集11

我自己的原文哦~ https://blog.51cto.com/whaosoft/12472192 #LightSeq 最高加速9倍&#xff01;字节跳动开源8比特混合精度Transformer引擎,近年来&#xff0c;Transformer 已经成为了 NLP 和 CV 等领域的主流模型&#xff0c;但庞大的模型参数限制了它的高效训练和推理。…

海云安开发者安全智能助手D10荣膺 “ AI标杆产品 ” 称号,首席科学家齐大伟博士入选2024年度 “ 十大杰出青年 ”

2024年12月27日&#xff0c;粤港澳大湾区AI领袖峰会在深圳成功举办&#xff0c;大会表彰了在人工智能技术创新、应用实践和产业发展等方面取得优异成绩的企业和个人&#xff0c;深圳海云安网络安全技术有限公司开发者安全智能助手D10荣膺“AI标杆产品”称号。同时&#xff0c;公…

Autodl转发端口,在本地机器上运行Autodl服务器中的ipynb文件

通过 SSH 隧道将远程端口转发到本地机器 输入服务器示例的SSH指令和密码&#xff0c;将远程的6006端口代理到本地 在服务器终端&#xff0c;激活conda虚拟环境 conda activate posecnnexport PYOPENGL_PLATFORMegljupyter notebook --no-browser --port6006 --allow-root从…

网站建设公司哪家好?我的避坑指南

公司刚成立那个时候&#xff0c;第一步就是想着抓紧做一个官网&#xff0c;因为一个好的网站可以通过互联网源源不断的带来客流&#xff0c;所以小公司业务最重要&#xff0c;我就赶紧在网上开始找公司。 网站是的大活&#xff0c;对于我这种什么都不会的&#xff0c;当然只能…

浅谈云计算15 | 存储可靠性技术(RAID)

存储可靠性技术 一、存储可靠性需求1.1 数据完整性1.2 数据可用性1.3 故障容错性 二、传统RAID技术剖析2.1 RAID 02.2 RAID 12.3 RAID 52.4 RAID 62.5 RAID 10 三、RAID 2.0技术3.1 RAID 2.0技术原理3.1.1 两层虚拟化管理模式3.1.2 数据分布与重构 3.2 RAID 2.0技术优势3.2.1 自…

qml RadialGradient详解

1、概述 RadialGradient是QML中用于创建径向渐变效果的一种类型。它允许您定义从中心向外辐射的颜色渐变&#xff0c;可以应用于各种QML可视组件上&#xff0c;如Rectangle、Image等&#xff0c;以创建出丰富的视觉效果。 2、重要属性 angle&#xff1a;定义渐变围绕其中心点…

链表 -- 反转链表,k个一组翻转链表,两两交换链表中结点

目录 反转链表 题目 ​编辑 分析 代码 k个一组翻转链表 题目 分析 代码 两两交换链表中的结点 题目 ​编辑 分析 代码 反转链表 题目 分析 反转过程: newhead作为遍历指针,最终停在尾结点上prev保存上一个结点,通过改变newhead和prev的连接来实现反转(核心)通过ne…

mac配置 iTerm2 使用lrzsz与服务器传输文件

mac配置 1. 安装支持rz和sz命令的lrzsz brew install lrzsz2. 下载iterm2-send-zmodem.sh和iterm2-recv-zmodem.sh两个脚本 # 克隆仓库 git clone https://github.com/aikuyun/iterm2-zmodem ~/iterm2-zmodem# 进入到仓库目录 cd ~/iterm2-zmodem# 设置脚本文件可执行权限 c…

统计学习算法——决策树

内容来自B站Up主&#xff1a;风中摇曳的小萝卜https://www.bilibili.com/video/BV1ar4y137GD&#xff0c;仅为个人学习所用。 问题引入 有15位客户向某银行申请贷款&#xff0c;下面是他们的一些基本信息&#xff0c;类别列表示是否通过贷款申请&#xff0c;是表示通过贷款申…

疫苗预约小程序ssm+论文源码调试讲解

第4章 系统设计 一个成功设计的系统在内容上必定是丰富的&#xff0c;在系统外观或系统功能上必定是对用户友好的。所以为了提升系统的价值&#xff0c;吸引更多的访问者访问系统&#xff0c;以及让来访用户可以花费更多时间停留在系统上&#xff0c;则表明该系统设计得比较专…

物联网网关Web服务器--lighttpd服务器部署与应用测试

以下是在国产ARM处理器E2000飞腾派开发板上部署 lighttpd 并进行 CGI 应用开发的步骤&#xff1a; 1、lighttpd简介 Lighttpd 是一款轻量级的开源 Web 服务器软件&#xff0c;具有以下特点和功能&#xff1a; 特点 轻量级&#xff1a;Lighttpd 在设计上注重轻量级和高效性&a…

Linux的常用命令(三)

目录 六、网络通信命令 1.网络通信命令ping 2.网络通信命令ifconfig 七、系统命令 1. 系统命令shutdown 2. 系统命令reboot 八、vi编辑器 六、网络通信命令 1.网络通信命令ping 命令名称&#xff1a;ping 命令所在路径&#xff1a;/usr/sbin/ping 执行权限&#xff…

CryptoMamba:利用状态空间模型实现精确的比特币价格预测

“CryptoMamba: Leveraging State Space Models for Accurate Bitcoin Price Prediction” 论文地址&#xff1a;https://arxiv.org/pdf/2501.01010 Github地址&#xff1a;https://github.com/MShahabSepehri/CryptoMamba 摘要 预测比特币价格由于市场的高波动性和复杂的非线…

【图表示例】元素-边-01

G6A Graph Visualization Framework in JavaScripthttps://g6.antv.antgroup.com/zh/examples/element/edge/#line 项目的创建参考 G6 详细教程&#xff0c;注意&#xff0c;node版本需要&#xff1a;required: { node: >18 }G6A Graph Visualization Framework in JavaScri…

永磁同步电机参数辨识算法--变增益MRAS方法在线辨识转动惯量

一、原理介绍 现有的转动惯量辨识方案可归纳为两类:离线转动惯量辨识方案和在线转动惯量辨识方案。离线转动惯量辨识方案是在系统控制程序运行前通过直接测试法、加减速法和人工轨迹法等对惯量进行辨识&#xff0c;将测得的参数提供给控制程序使用。离线式辨识方法需要对大量的…

《研发管理 APQP 软件系统》——汽车电子行业的应用收益分析

全星研发管理 APQP 软件系统在汽车电子行业的应用收益分析 在汽车电子行业&#xff0c;技术革新迅猛&#xff0c;市场竞争激烈。《全星研发管理 APQP 软件系统》的应用&#xff0c;为企业带来了革命性的变化&#xff0c;诸多收益使其成为行业发展的关键驱动力。 《全星研发管理…

1月13日学习

[HITCON 2017]SSRFme 直接给了源代码&#xff0c;题目名称还是ssrf&#xff0c;那么该题大概率就是SSRF的漏洞&#xff0c;进行代码审计。 <?php// 检查是否存在 HTTP_X_FORWARDED_FOR 头&#xff0c;如果存在&#xff0c;则将其拆分为数组&#xff0c;并将第一个 IP 地址…

No.32 笔记 | 业务逻辑漏洞全解析:概念、成因与挖掘思路

业务逻辑漏洞全解析&#xff1a;概念、成因与挖掘思路 核心速览 本文将围绕 业务逻辑漏洞 展开详细探讨&#xff0c;包括 成因、常见类型、重要性 及 具体挖掘方法。业务逻辑漏洞是一种与系统核心功能逻辑深度绑定的漏洞&#xff0c;需结合 代码审计 和 手动测试 进行发现和分…

EF Core实体跟踪

快照更改跟踪 实体类没有实现属性值改变的通知机制&#xff0c;EF Core是如何检测到变化的呢&#xff1f; 快照更改跟踪&#xff1a;首次跟踪一个实体的时候&#xff0c;EF Core 会创建这个实体的快照。执行SaveChanges()等方法时&#xff0c;EF Core将会把存储的快照中的值与…