【C++面试】小厂S测试题

2023-10-12 06:50
文章标签 c++ 面试 测试题 小厂

本文主要是介绍【C++面试】小厂S测试题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 1.析构函数能否为虚函数
  • 2.Linux查看内存命令
  • 3.单例模式的类可以在类外构造对象吗
  • 4.git拉取代码
  • 5.进程间通信的方式
  • 6.STL用什么访问容器的数据
  • 7.构造函数能否为虚函数
  • 8.C++函数传参的3种形式
  • 9.Linux C++多线程同步的四种方式
  • 10.为了实现多态,构造子类对象时会生成啥表
  • 11.tcp协议位于哪一层
  • 12.C++中含有纯虚函数的类是什么类
  • 13.智能指针shared_ptr内部使用了什么机制对内存进行管理
  • 14.qt中点击一个按钮时,我们会期待自定义的某个函数被调用,这是什么机制
  • Reference

1.析构函数能否为虚函数

可以。
分析:如果析构函数没有设置为虚函数,当存在继承关系时,可能会存在内存泄漏的风险,如父类指针指向子类对象时,当我们在程序的最后delete掉父类指针,只会执行父类的析构函数,而不会执行子类的析构函数,造成内存泄漏的风险。

2.Linux查看内存命令

top命令,Linux的top命令提供Linux资源使用情况的实时更新信息。不仅可以查看Linux内存,也可以查看CPU以及各个进程之间的对资源的占用情况。
free也可以。

3.单例模式的类可以在类外构造对象吗

不能。

4.git拉取代码

git clone 网址

  • 拉取远程代码:git clone https://github.com/…/PrettyGirls.git
  • 查看本地分支和远程分支:
    • 1、cd PrettyGirls 到工程目录下;
    • 2、git branch -al 查看本地和远程的所有分支。
  • 将远程分支与本地分支进行关联;
  • 上传本地代码到远程分支上。

5.进程间通信的方式

  • 管道pipe:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
  • 命名管道FIFO:有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
  • 消息队列MessageQueue:消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
  • 共享存储SharedMemory:共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。
  • 信号量Semaphore:信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
  • 套接字Socket:套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。
  • 信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。

6.STL用什么访问容器的数据

可以用迭代器,像vector和string等可以直接用[i]下标访问数据。

7.构造函数能否为虚函数

不可以。
理由:C++编译期间,能确定创建的对象对应的类型,继承了什么在编译期间也是明确的,总之构建一个对象,必须知道具体的类型信息,里面有啥,所以没必要存在虚构造函数。因为虚函数的存在,是因为编译期间没法确定具体调用对象,才整虚函数、虚函数表等那些东西。

8.C++函数传参的3种形式

值传参,地址传参,传引用。

9.Linux C++多线程同步的四种方式

  • 互斥锁:特殊的全局变量,有lock和unlock两种状态。unlock的互斥锁可以由某个线程获得,一旦获得,这个互斥锁会锁上变成lock状态,此后只有该线程由权力打开该锁,其他线程想要获得互斥锁,必须得到互斥锁再次被打开之后。
  • 条件变量:当线程在等待满足某些条件时,使线程进入睡眠状态;一旦条件满足,就换线因等待满足特定条件而睡眠的线程。
  • 读写锁:读写锁最适用于对数据结构的读操作读操作次数多余写操作次数的场合。
  • 信号量:互斥锁只允许一个线程进入临界区,而信号量允许多个线程进入临界区。

10.为了实现多态,构造子类对象时会生成啥表

虚函数表。C++通过虚函数实现多态。比如场景中:写代码时不能在一开始确定调用的是基类的函数,还是派生类的成员函数,就在基类中用virtual关键字声明。

【纯虚函数的实现原理】
纯虚函数也一定是某个类的成员函数,含有纯虚函数的类叫做抽象类。在C++中,抽象类无法实例化对象。如果我们定义了Shape这样的类,那么,Shape类当中,因为有虚函数和纯虚函数,所以它一定有一个虚函数表,也就一定有一个虚函数表指针。在虚函数表当中,如果是纯虚函数,那么虚函数表中的函数指针值为0;如果是普通的虚函数,那就肯定是一个有意义的值。
在这里插入图片描述
【阿里面试】问题:成员变量,虚函数表指针的位置是怎么排布?

如果一个类带有虚函数,那么该类实例对象的内存布局如下:

  • 首先是一个虚函数指针
  • 接下来是该类的成员变量,按照成员在类当中声明的顺序排布,整体对象的大小由于内存对齐会有空白补齐。
  • 其次如果基类没有虚函数但是子类含有虚函数:
    • 此时父类是没有虚函数表指针的;
    • 此时内存子类对象的内存排布也是先虚函数表指针再各个成员。

【代码栗子】
如果将子类指针转换成基类指针此时编译器会根据偏移做转换。在visual studio,x64环境下测试,下面的Parent p = Child();是父类对象,由子类来实例化对象。

#include <iostream>
using namespace std;class Parent{
public:int a;int b;
};class Child:public Parent{
public:virtual void test(){}int c;
};int main() {Child c = Child();Parent p = Child();cout << sizeof(c) << endl;//24cout << sizeof(p) << endl;//8Child* cc = new Child();Parent* pp = cc;cout << cc << endl;//0x7fbe98402a50cout << pp << endl;//0x7fbe98402a58cout << endl << "子类对象abc成员地址:" << endl;cout << &(cc->a) << endl;//0x7fbe98402a58cout << &(cc->b) << endl;//0x7fbe98402a5ccout << &(cc->c) << endl;//0x7fbe98402a60system("pause");return 0;
}

结果如下:

24
8
0000013AC9BA4A40
0000013AC9BA4A48子类对象abc成员地址:
0000013AC9BA4A48
0000013AC9BA4A4C
0000013AC9BA4A50
请按任意键继续. . .

分析上面的结果:
(1)第一行24为子类对象的大小,首先是虚函数表指针8B,然后是2个继承父类的int型数值,还有1个是该子类本身的int型数值,最后的4是填充的。
(2)第二行的8为父类对象的大小,该父类对象由子类初始化,含有2个int型成员变量。
(3)子类指针cc指向又new出来的子类对象(第三个),然后父类指针pp指向这个子类对象,这两个指针的值:
父类指针pp值:0000013AC9BA4A48
子类指针cc值:0000013AC9BA4A40
即发现如之前所说的:如果将子类指针转换成基类指针此时编译器会根据偏移做转换。我测试环境是64位,所以指针为8个字节。转换之后pp和cc相差一个虚表指针的偏移。
(4)&(cc->a)的值即 0000013AC9BA4A48,和pp值是一样的,注意前面的 0000013AC9BA4A40到0000013AC9BA4A47其实就是子类对象的虚函数表指针了。

11.tcp协议位于哪一层

传输层。
(1)OSI七层模型:“物联网淑惠适用”:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。
(2)TCP和UDP的区别:
TCP:面向连接的,双向的,顺序的,可靠的(校验),差错恢复
UDP:面向非连接的,非顺序的,效率高(一般用于语音,视频的传输)

12.C++中含有纯虚函数的类是什么类

抽象类,用=0标识,该类不能实例化对象。如果该类只有纯虚函数,则叫为接口类。

13.智能指针shared_ptr内部使用了什么机制对内存进行管理

  • 智能指针主要用于管理在堆上分配的内存,它将普通的指针封装为一个栈对象。当栈对象的生存周期结束后,会在析构函数中释放掉申请的内存,从而防止内存泄漏。
  • shared_ptr智能指针:通过引用计数的方式来实现多个shared_ptr对象之间共享资源。
  • shared_ptr进行初始化时不能将一个普通指针直接赋值给智能指针,因为一个是指针,一个是类。可以通过make_shared函数或者通过构造函数传入普通指针。并可以通过get函数获得普通指针。

14.qt中点击一个按钮时,我们会期待自定义的某个函数被调用,这是什么机制

信号槽机制。
在这里插入图片描述

Reference

[1] 进程间通讯的7种方式
[2] git 拉取远程代码
[3] Linux C++多线程同步的四种方式
[4] https://blog.csdn.net/qq_39382769/article/details/96075346

这篇关于【C++面试】小厂S测试题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/194087

相关文章

字节面试 | 如何测试RocketMQ、RocketMQ?

字节面试:RocketMQ是怎么测试的呢? 答: 首先保证消息的消费正确、设计逆向用例,在验证消息内容为空等情况时的消费正确性; 推送大批量MQ,通过Admin控制台查看MQ消费的情况,是否出现消费假死、TPS是否正常等等问题。(上述都是临场发挥,但是RocketMQ真正的测试点,还真的需要探讨) 01 先了解RocketMQ 作为测试也是要简单了解RocketMQ。简单来说,就是一个分

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

C++包装器

包装器 在 C++ 中,“包装器”通常指的是一种设计模式或编程技巧,用于封装其他代码或对象,使其更易于使用、管理或扩展。包装器的概念在编程中非常普遍,可以用于函数、类、库等多个方面。下面是几个常见的 “包装器” 类型: 1. 函数包装器 函数包装器用于封装一个或多个函数,使其接口更统一或更便于调用。例如,std::function 是一个通用的函数包装器,它可以存储任意可调用对象(函数、函数

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

06 C++Lambda表达式

lambda表达式的定义 没有显式模版形参的lambda表达式 [捕获] 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 有显式模版形参的lambda表达式 [捕获] <模版形参> 模版约束 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 含义 捕获:包含零个或者多个捕获符的逗号分隔列表 模板形参:用于泛型lambda提供个模板形参的名

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

【C++高阶】C++类型转换全攻略:深入理解并高效应用

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C++ “ 登神长阶 ” 🤡往期回顾🤡:C++ 智能指针 🌹🌹期待您的关注 🌹🌹 ❀C++的类型转换 📒1. C语言中的类型转换📚2. C++强制类型转换⛰️static_cast🌞reinterpret_cast⭐const_cast🍁dynamic_cast 📜3. C++强制类型转换的原因📝

C++——stack、queue的实现及deque的介绍

目录 1.stack与queue的实现 1.1stack的实现  1.2 queue的实现 2.重温vector、list、stack、queue的介绍 2.1 STL标准库中stack和queue的底层结构  3.deque的简单介绍 3.1为什么选择deque作为stack和queue的底层默认容器  3.2 STL中对stack与queue的模拟实现 ①stack模拟实现