C++面试八股文:C++中,设计一个类要注意哪些东西?

C++面试八股文:技术勘误 这里的erase返回的是下一个迭代器,然后++就是下下个迭代器,跳过了下个迭代器。不知不觉,《C++面试八股文》已经更新30篇了,这是我第一次写技术博客,由于个人能力有限,出现了不少纰漏,在此向各位读者小伙伴们致歉。不仅帮助我改正了文章中的错误,也让我有机会更新和修正自己的知识储备库。同时不同编译器对标准的实现也不尽相同,这增加了C++学习者的负担。二师兄:不可以,因为构造函数在对象构造阶段调用,虚表尚未建立,所以无法调用虚函数实现多态。为了不误导更多的小伙伴,以后会不定期的出勘误文章,请各位小伙伴留意。 阅读详情

某日二师兄参加XXX科技公司的C++工程师开发岗位第9面:

面试官:C++中,设计一个类要注意哪些东西?

二师兄:设计一个类主要考虑以下几个方面:1.面向对象的封装、继承及多态。2.big three或者big five。3.运算符和函数重载、静态成员、友元、异常处理等相关问题。

面试官:请介绍一下面向对象的三个特性。

二师兄:封装是将类的函数和数据封装起来,外部不能直接访问类的数据,而是需要通过方法访问数据。继承是指一个类可以继承另一个类的属性和方法。多态是指一个对象可以表现出多种形态。

面试官:请问多态是如何实现的?

二师兄:多态的是通过父类的指针或引用指向子类的对象实现的。在对象中维护一个虚指针(vtptr),这个指针指向一个虚表(vtable),当用户通过父类对象访问子类的方法时,通过查询虚表中对应的方法的地址,并跳转到此地址执行间接访问对象的方法。所以多态是有一点点运行时开销的。

面试官:你刚才所说的big three和big five是什么?

二师兄:(嘿嘿,被装到了)类的big three分别是拷贝构造函数(copy constructor)、拷贝赋值运算符(copy assignment)和析构函数。而类的big five则多了两个,分别是移动构造函数(move constructor)和移动赋值运算符(move assignment)。后面两个是C++11之后引入的。

面试官:好的。那你知道为什么要引入移动构造和移动赋值吗?

二师兄:主要是为了效率。移动构造和移动赋值不需要把所有的数据重新拷贝一遍,而是霸占了被移动对象的数据的所有权。代价是被移动对象在被移动后不能使用。

面试官:嗯。那你知道为什么移动构造和移动赋值都要加上noexcept关键字吗?

二师兄:额。。。好像不让抛异常?

面试官:你知道类的静态成员变量需要注意哪些问题吗?

二师兄:要注意哪些问题?额。。。

面试官:在成员方法后加const是为什么?

二师兄:主要是为了约束这个成员方法不更改对象的任何数据。

面试官:还有其他的原因吗?

二师兄:好像没有了吧。。。

面试官:类的成员方法可以通过const符号重载吗?

二师兄:这个,,应该可以吧。。

面试官:你知道什么是类的成员方法的引用限定符吗?

二师兄:没有听说过耶。。。

面试官:好的,回去等通知吧。

让我们来看一看今日二师兄的表现吧,

为什么移动构造和移动赋值都要加上noexcept关键字?

因为在使用移动语义时,通常会将资源的所有权从一个对象转移到另一个对象,而不是复制资源。如果抛出异常,那么在转移资源的过程中可能会出现问题,导致资源泄漏或其他不可预测的行为。

另外,加上 noexcept 关键字还可以提高代码的性能,因为编译器可以在不必要的情况下进行优化。

类的静态成员变量需要注意哪些问题?

静态成员变量的初始化顺序是不确定的。如果一个静态成员变量依赖于另一个静态成员变量的值,要确保第二个静态化成员先被初始化,否则程序可能会出现未定义的行为。

静态成员变量的值可以被多个实例同时修改,因此在多线程访问静态成员时要注意数据竞争问题。静态变量的生命周期与程序的生命周期相同,因此它们可能会占用大量的内存。

在成员方法后加const是为什么?

一是可以约束此方法不会更改对象的任何数据。二是cosnt对象也可以访问此成员方法。

#include <iostream>
struct Foo
{
    void f1(){std::cout <<"f1" << std::endl;}
    void f2() const{std::cout <<"f2" << std::endl;}
};
int main(int argc, char const *argv[])
{
    Foo foo;
    foo.f1();
    foo.f2();
    const Foo& foo2 = foo;
    foo2.f1();  //这里无法通过编译,因为const对象无法访问非const 方法
    foo2.f2();  //这里可以通过编译
}

类的成员方法可以通过const符号重载吗?

这是一个很好的问题,估计很多人没有思考过。先说答案,底层const可以,而顶层const不可以。

#include <iostream>
struct Foo{};
struct Goo
{
    void f1(Foo& f){std::cout <<"non const function" << std::endl;}
    void f1(const Foo& f){std::cout <<"const function" << std::endl;}
};
int main(int argc, char const *argv[])
{
    Foo foo;
    Goo goo;
    goo.f1(foo);    //无法通过编译,error: ‘void Goo::f1(Foo)’ cannot be overloaded with ‘void Goo::f1(Foo)’
    return 0;
}

当我们把顶层const改为底层const,

#include <iostream>
struct Foo{};
struct Goo
{
    void f1(Foo& f){std::cout <<"non const function" << std::endl;}
    void f1(const Foo& f){std::cout <<"const function" << std::endl;}
};
int main(int argc, char const *argv[])
{
    Foo non_const_foo;
    const Foo const_foo;
    Goo goo;
    goo.f1(non_const_foo);    //可以通过编译    non const function
    goo.f1(const_foo);    //可以通过编译 const function
    return 0;
}

那么我们能否通过在函数括号后加上const来重载函数呢?

#include <iostream>
struct Goo
{
    void f1() {std::cout <<"non const function" << std::endl;}
    void f1() const{std::cout <<"const function" << std::endl;}
};
int main(int argc, char const *argv[])
{
    Goo non_const_goo;
    const Goo const_goo;
    non_const_goo.f1();   
    const_goo.f1();   
    return 0;
}

答案是肯定的,因为const_goo.f1() 可以等同于f1(const Goo* goo),也是底层const。

最后一个问题虽然简单,但我相信至少有80%的C++程序员不知道是什么,

什么是类的成员方法的引用限定符吗?

类的成员方法的引用限定符是 C++11 中引入的一种新特性,用于指定成员方法的参数是左值引用还是右值引用。

#include <iostream>
struct Foo
{
    void f1() & {std::cout << "only left reference can call this function" << std::endl;}
    void f1() && {std::cout << "only right reference can call this function" << std::endl;}
};
int main(int argc, char const *argv[])
{
    Foo foo;
    foo.f1();       //left reference
    Foo().f1();     //right reference
    return 0;
}

好了,今日份面试到这里就结束了,小伙伴们,对于今天二师兄的面试,能打几分呢?如果是你,以上的问题都能回答的上来吗?

关注我,带你21天“精通”C++!(狗头)

大厂C++面试经验 大厂C++面经 文章目录大厂C++面经前言一、字节跳动一面(90min):二、华为一面(60min):三、上海立芯(120min): 前言 本科双非,已拿20k的offer,特来分享一波面经 一、字节跳动一面(90min): 1、自我介绍 2、项目介绍: 因为我的项目是基于人脸识别的,所以面试官问了具体的人脸算法,我大致讲了一下算法思路和算法流程 有没有做过并发测试?(没。。) 项目中遇到哪些问题,如何去解决的? 人脸检测的时间复杂度是多少? 然后面试官和我探讨了一下算法优化问题,闲聊了不少人脸的东 阅读详情

相关推荐

C++面试备战指南:从八股文到源码,构建你的知识骨架

在C++岗位的面试中,面试官往往不再满足于背诵概念,而是通过底层实现、源码原理和场景化追问来考察候选人的真实水平。理解constexpr的版本演进、std::move的实际动作、shared_ptr的引用计数机制、vector扩容的均摊复杂度等核心知识,是打通语言底层与工程实践的关键。掌握这些原理不仅能应对高频考点,还能在项目实践中指导性能优化与内存管理。对于正在准备校招或社招的开发者,从现代C++特性、STL容器、内存并发到手撕算法,再到CMake、Docker等工具链,系统性地搭建知识网络远比零散刷题更

weixin_42529366的博客 234

20 万字的 C++ 八股文&图解源码,发布!

大家好,我是小贺。上周我放言说,这个礼拜整理出「C++ 八股文」,给最近秋招季参加面试的读者朋友们,然后就有好几个读者追问小贺的 C++ 八股文啥时候出,从大家的急切的言语中,能感受出大......

herongwei 的 BLOG 1万+

C++面试八股文:C和C++有哪些区别?

小二:C是面向过程的编程语言,而C++不仅是面向过程的编程语言,还是面向对象的编程语言。小二:C++号称是C的超集,其实大部分时间这句话是对的,但还有一些细微的点C++是不能兼容C语言的,如balabalabala...实际上这句话是有问题的,严格的说,C语言和C++有很多交集,这部分交集占了C语言的大部分,占了C++的小部分。如C语言中的main函数的返回值可以是任何类型,但在C++中main函数的返回值只能是int类型。如空结构体在C语言中的大小是0,而在C++中的大小是1。小二:C++是C的超集。

binarch的博客 241

C++八股文面试

🔥🔥引入反码和补码是为了简化二进制数的减法运算;(作用)在计算机内一个整数是通过二进制进行存储的,该二进制的最左边一位为符号位,0代表正数,1代表负数。(1)原码(二进制):一个十进制数转化成的二进制数就是这个十进制数的原码。例如:8(十进制)的原码是0000 1000;(2)反码:正数的反码与原码相同:如:8 原码为0000 1000,反码为0000 1000负数为原码0变1,1变0,(符号位不变):如:-8 原码为1000 1000,反码为1111 0111(3)补码。

biyesheji1000的专栏 1463

GPT-4时代,刷算法题和背八股文还有意义吗?

随着大语言模型(LLM)的兴起,越来越多的开发者开始用GPT-4辅助刷题、背八股文,但面试考察的从来不是答案本身,而是思考过程与底层模型的构建能力。GPT-4能瞬间给出最优解,却无法替代你在需求模糊时主动提问、在资源受限时权衡取舍的工程素养。算法题本质是“压缩版的需求开发”,八股文则对应着一套技术体系的底层模型。善用AI作为陪练,通过追问式学习、场景变体题来主动提取知识,才能把GPT-4变成提升面试效率的杠杆,而非削弱能力的拐杖。本文从技术面试的本质出发,结合Java等方向的实操经验,拆解AI时代如何重新准

weixin_33922672的博客 415

多雷达协同探测技术研究进展:认知跟踪与资源调度算法

源自:雷达学报作者:易伟 袁野 刘光宏 葛建军 孔令讲 杨建宇雷达是信息感知的千里眼,具有极高的军用和民用价值,广泛应用在防空预警、遥感测绘、反恐维稳等领域[1–5]。雷达信息获取与探测技术也一直是大国竞相抢占的前沿技术,同时是信息科学的重要组成部分。随着科学技术不断进步,先进电子对抗装备的不断问世和广泛列装,雷达的生存与发展正面临日益严峻的挑战。从生存环境上看,雷达面临通信等各类民用电磁干扰以及复杂的军用电磁干扰;从探测对象上看,集群、微弱、隐身、高空、低空等多样化目标的出现也给雷达探测与识别带来困难。

renhongxia1的博客 2783

C++八股文

本博客记录本人遇到的C++八股问题,并根据自己的理解作出回答(由于是个人理解,所以答案不一定完全准确和全面,这么做的原因是我觉得有的问题的标准答案太过抽象且不好记忆QAQ,所以我会在理解后用自己的话来作答),有些不好理解的点会附上代码帮助理解。由于我写这篇博客时是默写的(相当于是对之前背的知识的复习),所以可能会漏掉一些东西,正文中标蓝的字表示是后来补充的。

qq_53338738的博客 1567

ANSYS Workbench对称分析进阶:手把手教你用Pre-Meshed Cyclic Region处理外部导入的复杂网格模型

本文详细介绍了ANSYS Workbench中Pre-Meshed Cyclic Region功能在处理外部导入复杂网格模型时的应用。通过循环对称分析技术,可显著减少计算资源消耗,特别适用于叶轮机械、齿轮组等周期性结构分析。文章深入解析了该功能的底层逻辑,并提供了从NASTRAN文件导入的离心压缩机叶轮案例,帮助工程师克服网格匹配难题。

weixin_28630185的博客 313

C++基础技能练习场:从环境配置到面试八股文的实战路线

C++是一门强调动手实践的语言,掌握它不能只看书,必须通过可编译、可运行的小程序来内化知识点。从搭建开发环境开始,理解编译器与调试器的协作流程,是解决编译错误的第一步。在此基础上,字符串数组初始化、排序与快速幂等高频算法,是培养代码手感的关键。而指针、链表、回调函数等概念,则帮助开发者建立内存思维。进一步深入到面向对象、设计模式乃至多线程并发,能够应对复杂工程与面试挑战。本文以“C++基础技能练习场”为主线,覆盖环境配置、语法手感、算法套路、内存认知、并发基础等完整学习路径,并辅以大量可运行的代码示例,适合

weixin_33885676的博客 401

别再只看pLDDT了!AlphaFold预测结果解读保姆级指南:pLDDT、PAE、pTM、ipTM到底怎么看?

本文详细解析了AlphaFold预测结果中的关键指标pLDDT、PAE、pTM和ipTM,帮助用户从单一依赖pLDDT进阶到全面理解蛋白质结构预测。通过实际案例和技巧,指导如何正确解读这些指标,避免常见错误,并提供了从预测到发表的实用建议。

weixin_29100399的博客 355

Frida提取Cocos游戏XXTEA密钥的实战方法论

XXTEA是一种轻量级分组加密算法,广泛用于移动端游戏通信保护;其128位密钥的安全性直接决定网络协议逆向成败。在Cocos引擎生态中,密钥常以静态常量、JNI动态传递或Native运行时派生三种形态存在,导致传统静态分析失效。Frida凭借跨Java/Native注入能力与内存实时观测优势,成为捕获密钥‘出生瞬间’的关键工具——尤其适用于hook xxtea_encrypt函数入口、监控JNI参数传递、设置内存断点追踪派生过程等场景。本文聚焦Cocos2d-x与Cocos Creator项目,覆盖从密钥识

weixin_33509600的博客 418

技术面试八股文:从背题到知识体系的进阶指南

“八股文”在技术面试中常被诟病为死记硬背,但本质上它是计算机基础知识体系的浓缩骨架。从HashMap底层原理到Kafka支撑百万并发的设计机制,这些高频面试题背后隐藏着数据结构、操作系统、分布式系统等核心原理。理解这些“确定性知识”的来龙去脉,不仅能帮助候选人在Java、C++、嵌入式等方向建立结构化知识网络,还能作为工程师之间高效沟通的协议。在项目实践中,将理论题拆解为可验证的工程问题,比如用缓存穿透、消息队列可靠性等场景反向检验理解深度,才能真正把八股文转化为技术成长的导航地图。本文从面试官与候选人双视

weixin_34210740的博客 476

Labview项目01:标准可配置序列测试框架

摘要:本文介绍了一个基于LabVIEW2020开发的通用测试框架系统。该系统采用模块化设计,包含主界面、调试界面、设置界面和登录界面。主功能包括:1)可配置测试序列,支持延时、预定值输出、随机值输出等操作;2)单步测试功能自主添加;3)界面支持测试序列编辑和权限管理。系统采用队列机制处理事件和测试流程,通过CSV文件存储测试序列,支持参数化配置。用户可自定义测试VI(A_.vi和N_.vi格式),并通过调试界面验证测试序列。最终测试结果在主界面显示,提供整体判断功能。该系统既可作为学习参考,也可用于实际测试

weixin_38637405的博客 1552

C++ 面试八股文总结 -- 面向对象

C++ 面试八股文总结 -- 面向对象

m0_47999117的博客 3366

基于simulink的预测电流控制策略的三相逆变器仿真

本文详细介绍了在Simulink中实现基于预测电流控制策略的三相逆变器仿真方法。主要内容包括:准备工作(安装必要软件及工具箱)、构建三相逆变器基础模型、设计预测电流控制器(包含状态空间建模和控制器设计)、实现控制逻辑、添加示波器观察输出、配置仿真参数以及运行仿真分析结果。通过MATLAB代码示例和Simulink模块说明,展示了如何选择最优开关状态来最小化电流误差。该仿真方法为研究快速响应、高精度的逆变器控制提供了实用工具,但需注意实际应用中可能需要的调试工作。

amy_mhd的博客 276

【Zabbix实战之部署篇】Docker部署Zabbix+grafana监控平台

【Zabbix实战之部署篇】docker部署Zabbix+grafana监控平台

jks212454的博客 2578

JVM 面试八股文

JVM 八股文面试题

2401_83595513的博客 2077

【AHE数据集】中国2019年多源热排放数据集-500m空间分辨率

【AHE数据集】中国2019年多源热排放数据集

WW、forever的博客 411

移动开发面试八股文:每天5分钟吃透核心原理

在移动开发面试中,底层机制类问题往往比项目经验更能体现候选人的基本功。无论是Handler的消息循环、Looper的轮询调度,还是线程池与内存管理,这些看似独立的八股知识点,本质上都服务于客户端有限的资源与复杂的生命周期。理解它们背后的设计原理,不仅能帮助你在面试中从容应对追问,更能提升日常开发中排查崩溃、优化卡顿的实战能力。从基础概念入手,逐步拆解机制细节,再串联到工程应用场景,是一条高效且可持续的学习路径。本系列正是基于这样的理念,以碎片化、单点深入的方式,带你系统掌握移动开发面试中的高频考点,让每一次

weixin_33892359的博客 420

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

联想22校招C++全流程指南:笔试真题、八股文与面试经验

校招季中,C++方向的技术考察历来是重头戏,从语言基础到算法设计,从内存管理到多线程并发,每一个环节都考验着候选人的工程实践能力。对于准备大厂C++岗位的同学而言,理解核心概念与底层原理,远比死记硬背面经更重要。本文从C++基础知识与常见面试题出发,梳理了从网申、笔试到面试的完整备战路径,重点拆解了C++八股文中的高频考点,如智能指针、constexpr、设计模式与ABA问题,并结合实际项目经验,讲解如何将理论转化为面试中的亮点。同时针对笔试中常见的排序算法、快速幂与单调栈等算法题,以及VSCode配置、动

weixin_34416754的博客 384

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

技术面试八股文:从知识框架到工程能力的正确打开方式

技术面试中,围绕JVM、MySQL、Redis等核心知识的高频问答常被戏称为“八股文”。这类题目看似死板,实则是考察开发者对基础原理的理解深度。扎实的知识框架能帮助工程师在面对高并发、性能调优等复杂问题时,快速定位瓶颈并做出合理技术选型;面试中的系统化追问与项目深挖,正是将理论转化为工程能力的试金石。对于求职者而言,与其死记硬背,不如先构建知识地图,再用费曼学习法将每个知识点讲透,最后通过模拟面试锤炼表达。全面剖析八股文的本质与局限,阐述如何将背诵转化为真正的技术竞争力,既有学习策略,也有实战复盘,为读者提

weixin_33970449的博客 420

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

C++面试八股文:什么是智能指针?

二师兄:Foo中有一个智能指针指向Goo,而Goo中也有一根智能指针指向Foo,这就是循环引用,我们可以使用weak_ptr来解决这个文通。二师兄:智能指针是C++11引入的类模板,用于管理资源,行为类似于指针,但不需要手动申请、释放资源,所以称为智能指针。二师兄:是因为如果返回的裸指针被释放了,智能指针持有的资源也失效了,对智能指针的操作是未定义的行为。的原子变量,原子变量在自增自减时是线程安全的,这保证了多线程读写智能指针时是安全的。面试官:好的,今天的面试结束了,请回去等通知吧。

2301_78287784的博客 177
上一篇: C++面试八股文:C++中,函数的参数应该传值还是传引用?
下一篇: C++面试八股文:了解sizeof操作符吗?
二进制架构
博客等级 码龄3年 10粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二进制架构

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值