华云三维科技 C++开发

基本看简历问的 无手撕

1. 自我介绍

2. 介绍一下虚函数

答案:虚函数是 C++ 实现运行时多态的核心机制。当基类把某个成员函数声明为 virtual 之后,子类就可以重写它。通过基类指针或引用调用这个函数时,最终执行的是对象真实类型对应的版本,而不是指针静态类型对应的版本。底层通常依赖虚函数表和虚表指针来完成动态分发,所以它带来的好处是接口统一、扩展方便,代价是对象里通常会多一个虚表指针,并且调用时多一次间接寻址。如果一个类会被当作基类使用,析构函数一般也应该声明成虚函数,否则通过基类指针删除派生类对象时容易出问题。

代码:

#include <iostream>
using namespace std;

class Base {
public:
    virtual void show() { cout << "Base\n"; }
    virtual ~Base() = default;
};

class Derived : public Base {
public:
    void show() override { cout << "Derived\n"; }
};

int main() {
    Base* p = new Derived();
    p->show();
    delete p;
    return 0;
}

3. 派生类和基类可以互相转换吗,转换时内存层面怎么理解

答案:派生类对象可以向上转型成基类指针或引用,这种转换通常是安全的,因为派生类对象里本来就包含一个基类子对象。反过来,基类指针不能随便直接当成派生类指针使用,因为基类对象未必真的就是那个派生类实例。如果强转错了,访问派生类新增成员时就是未定义行为。从内存布局上看,单继承场景下,派生类对象通常会先放基类部分,再放自己扩展的成员,所以向上转型很多时候只是不需要额外改动或者做一个固定偏移。多继承场景就会复杂一些,不同基类子对象在同一个对象里的位置可能不同。如果需要在运行时判断一个基类指针是否真的指向某个派生类,通常用 dynamic_cast

代码:

#include <iostream>
using namespace std;

class Base {
public:
    virtual ~Base() = default;
};

class Derived : public Base {
public:
    void work() { cout << "Derived::work\n"; }
};

int main() {
    Base* p = new Derived();

    if (Derived* d = dynamic_cast<Derived*>(p)) {
        d->work();
    }

    delete p;
    return 0;
}

4. 数组和链表的区别

答案:数组的特点是连续存储,支持通过下标快速访问,缓存局部性也比较好,所以遍历通常很快。链表的特点是节点分散存储,插入和删除某个已知位置的节点比较方便,不需要像数组那样整体搬移元素。但如果从真实机器执行效率看,很多场景下数组或者 vector 会比链表更快,因为链表访问时会频繁跳地址,缓存命中率不高。所以这题不只是答“数组查找快、链表插入快”,更重要的是知道连续内存、缓存局部性和实际工程中的取舍。

5. 智能指针有哪些,使用时要注意什么

答案:常见智能指针有 unique_ptrshared_ptrweak_ptrunique_ptr 表示独占所有权,语义最清晰,开销也比较小;shared_ptr 通过引用计数实现共享所有权;weak_ptr 不参与对象拥有关系,主要用来观察 shared_ptr 管理对象的生命周期。使用时最需要注意的是所有权设计,不要一上来就全用 shared_ptr。如果对象的拥有关系明确,优先用 unique_ptr;如果存在循环引用风险,要用 weak_ptr 打破环。另外还要注意不要从同一个裸指针重复构造多个 shared_ptr,否则会形成多个控制块,最后重复释放。

代码:

#include <memory>
using namespace std;

struct B;

struct A {
    shared_ptr<B> b;
};

struct B {
    weak_ptr<A> a;
};

int main() {
    auto pa = make_shared<A>();
    auto pb = make_shared<B>();
    pa->b = pb;
    pb->a = pa;
    return 0;
}

6. set 能存自定义类型吗,需要注意什么

答案:可以。set 底层通常是有序关联容器,插入元素时需要比较大小,所以自定义类型要能提供严格弱序关系。最常见的做法是重载 operator<,或者在模板参数里传入自定义比较器。需要注意的是,这个比较逻辑不仅决定排序顺序,还决定元素是否被认为“相等”。如果两个对象互相都不小于对方,set就会把它

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

C++ 常考面试题总结 文章被收录于专栏

本专栏系统梳理C++方向, 大中厂高频高频面试考点 , 内容皆来自真实面试经历,从基础语法、内存管理、STL与设计模式,到操作系统与项目实战,结合真实面试题深度解析,帮助开发者高效查漏补缺,提升技术理解与面试通过率,打造扎实的C++工程能力.

全部评论

相关推荐

04-20 09:04
四川大学 Java
点赞 评论 收藏
分享
主包从3月初开始投的简历,最开始面的部门是IEG,然后二面的时候挂掉了,后面又被微信搜索给捞了,结果一面的时候又挂了,后面又被广州的WXG给捞过去了。没错,主包一共经历了六轮面试,好在最后的结果是很好的.......一面(1h左右)-&nbsp;自我介绍-&nbsp;拷打在美团的实习(占比很大)-&nbsp;项目(占比很少)-&nbsp;八股(cpp&nbsp;+&nbsp;OS&nbsp;+&nbsp;计网&nbsp;+&nbsp;数据库&nbsp;+&nbsp;rabbitMQ&nbsp;+&nbsp;redis)关于八股这块,MySQL底层问的比较多,其次就是cpp的继承和多态这块儿,中间件也问了些。-&nbsp;手撕两道算法:最长无重复子串&nbsp;+&nbsp;交换链表中的结点二面(1h左右)-&nbsp;自我介绍-&nbsp;拷打两段实习:美团,以及一家中厂的实习经历(同样占比很大)-&nbsp;少量八股(OS&nbsp;+&nbsp;数据库&nbsp;+&nbsp;LangChain&nbsp;+&nbsp;docker&nbsp;+&nbsp;cpp)关于八股这块,同样&nbsp;OS&nbsp;和&nbsp;数据库问的比较多,其他就是简历上写的一些小点-&nbsp;手撕两道算法&nbsp;+&nbsp;一道SQL优化:每m个结点反转单链表&nbsp;+&nbsp;合并两个有序数组,SQL优化的话,就是加索引(具体我搞忘了)-&nbsp;反问:部门情况,目前负责的业务。-&nbsp;最后面试官说还会加一场技术面。三面(50来分钟)-&nbsp;问实习:美团&nbsp;+&nbsp;中厂实习的情况。-&nbsp;科研情况、实验室方向、读研生活、个人爱好等等。-&nbsp;三面没有八股和手撕,除了实习问的比较多,其实就是一些个人的学习情况,以及怎么学习技术的...等等。-&nbsp;反问:组内业务、入职需要做什么(面试官讲的很详细,应该是大Boss)HR面(半小时)-&nbsp;自我介绍-&nbsp;家是哪儿的-&nbsp;平时怎么学习的-&nbsp;看你是28届的,为什么想这么早来实习?-&nbsp;导师放不放实习-&nbsp;在这三段实习中,有没有印象最深刻的?那位实习导师对你的帮助很大?-&nbsp;有无直系亲属在鹅工作?-&nbsp;其实就是为什么考研?如何平衡工作与个人学习?-&nbsp;等等之类的话题,比较轻松,就像是在聊天一样。-&nbsp;最后说的是周五之前出结果。总结主包一共有过三段实习经历(两段中厂&nbsp;+&nbsp;一段大厂),所以面试官更多的是在问实习期间做的事情,解决了什么问题之类的。八股和项目也有在问,但是问的没有实习那么多。除开美团,这是主包面的第二个大厂,虽然有点波折,但还是比较顺利。我个人认为,目前就业竞争比较大,越早实习越好,其次就是如果你本身已经有了&nbsp;1~2&nbsp;段大厂实习,那么约面的机会真的很大。字节、京东、滴滴都给了面试机会的,但是字节我挂了,然后京东和滴滴拒了,俗话说:有鹅选鹅嘛😂
牛客92772631...:28届都要抢了嘛
查看24道真题和解析
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务