日常实习C++面经汇总与教程

最近忙了大概一个月,终于找到实习了,这里把自己面试过程遇到的问题记录一下。

ps:很多东西我之前都写过文章,所以重复的地方就直接贴上过去的文章的链接了。

这里只放上有关C++的内容,其它的例如项目啊,编译链接工具的使用就因人而异了。

C++中的多态

以下是一个常见的多态的场景

struct A {
    virtual void foo() = 0;
};
struct B : A {
    virtual void foo() { cout << "this is B\n"; }
};
struct C : A {
    virtual void foo() { cout << "this is C\n"; }
};
struct D : A {
    virtual void foo() { cout << "this is D\n"; }
};

int main() {      
    vector<A*>v = { new B{},new C{},new D{} };
    for (auto& it : v) {
        it->foo();
    }
}

这里我们用到了虚函数

严格鸽:C++虚函数表的位置——从内存的角度

对于C++中对象的内存模型,我的建议是用C语言模拟一个

严格鸽:C语言实现虚函数/继承/封装

这里一个经常遇到的问题,为什么我们说虚函数慢?

考虑到,函数在执行的时候,需要进行跳转(汇编的角度而言就是动cs:ip

而虚函数,需要先去虚函数表里面,然后在跳转到相应的函数上,也就是跳转的次数多了,对cache不友好。

但是,最重要的是,虚函数不能进行内联优化。

请记住,C++的编译器的优化水平很高,但是对于虚函数这种“运行期”确定的函数,是不能依靠编译器进行编译优化的。

这里提到了,运行期,和编译期。这两个概念在后面也会提到。

那么如何解决这个问题呢?

我们可以使用编译期多态来CRTP来解决。

严格鸽:现代C++学习—— CRTP 编译期多态

(CRTP不是万能的,有些东西必须是运行期的

智能指针

智能指针的实现就是RAII

现代C++如果非要说是C with xxx的话,那么就是 C with RAII

严格鸽:现代C++学习—— 什么是RAII

严格鸽:现代C++学习 —— 为什么需要std::move

至于智能指针的具体实现,网上有很多,大家自己去看就可以了。

谈及智能指针,最好也谈以下所有权的概念

例如,我现在有个资源,然后我有个函数,我是选择把所有权给这个函数啊,还是把所有权留在原来的作用域。

(这个内容在上面的文章就有提及。

模板

模板就是面向编译器的编程,我们通过编写模板相关的代码,让编译器帮我们根据提供的类型,生成对应的代码。

另外,C++的类型系统是十分强大的,所以有关模板的内容希望大家好好学习。

C++模板学习实践 (这是个专栏,内容可能比较多,看是看完肯定有收获的

另外,有关模板的发展(可以我的文章里面的模板元都是const static 这种比较old的。

首先是模板变量和模板类型,过去我们需要::value,::type 现在可以直接定义了。

对于标准库,_v 就是 ::value , _t 就是::type ( 所以学一学old版本的很有帮忙的

还有就是constexpr 函数,对于编译期计算,可以直接constexpr 函数解决。

另外就是C++20的概念与约束了

过去我们需要用 严格鸽:现代C++学习——模板SFINAE 来表示一个鸭子类型。

鸭子类型:我希望一个类型具有这样的变量,这样的函数。。。

例如下面我们就约束了类型T是一个int或者一个具有size函数len成员变量的类型。

template<typename T>
concept is_int = is_same_v<T, int>;

template<typename T>
concept need = requires(T x) {
    x.size();
    x.len;
};
template<typename T>
requires(is_int<T> || need<T>)
void foo(T x) {

}
int main() {      
    foo(1);
    struct A {void size();int  len;};
    foo(A{});
    struct B { void Size(); int  Len; };
    foo(B{});//编译失败,ide会报错
}

上面是几个经常被问道的内容,属于基础了,下面放上几个杂项。

lambda

严格鸽:c++函数进化史 (函数,函数指针,function,仿函数,lambda)

lambda编译器帮我们生成的匿名的仿函数

variant

variant是可以析构的union

严格鸽:C/C++ union 使用教程 (常见操作与缺陷)

严格鸽:现代C++学习——实现多类型存储std::variant

类型擦除

在问std::any的实现的时候问的。

在C语言总,一般是用void* ,然后自己维护一个type

严格鸽:现代C++学习——实现动态类型std::any

模板元编程

就让写了个斐波那契数列

但是你可以归并排序!

严格鸽:模板元 编译期 链表 归并排序

多线程

问了一些实现什么的

原子类型是用cas (compare and swap) 实现的。

其它的锁都是基于原子类型的操作

std::call_once

之前没有听说过

std::call_once - cppreference.com

pimpl

为了加快编译时间的,但是我没这么用过(编译时间不是用来摸鱼的吗

有个面试官说过,可以用编译参数来控制。

堆,栈空间

堆是os帮我们维护的,栈空间编译器帮我们维护了。

注意不要写出这样的代码

int* foo() {
    int arr[100];
    return arr;
}

异常安全

没有怎么用过(最多几千行的代码,用啥异常啊)

可以了解下std::optional 与 std::expected

Effective C++ 29:追求异常安全的代码

关于noexcept,可以看下这个代码

void foo1() noexcept;
void foo1() noexcept(noexcept(foo1())) {

}

void foo2();
void foo2() noexcept(noexcept(foo2())) {

}
int main() {      
    constexpr bool x =  noexcept(foo1());
    constexpr bool y =  noexcept(foo2());
}

有一些忘了

#我的实习求职记录#
全部评论
ygg
3 回复 分享
发布于 2023-03-09 11:43 湖北
感谢分享
3 回复 分享
发布于 2023-03-10 22:10 广东
我觉得我认识你
2 回复 分享
发布于 2023-03-06 12:44 四川
谢谢分享,很有用
1 回复 分享
发布于 2023-03-03 09:06 上海
ygg永远滴神
1 回复 分享
发布于 2023-03-03 12:14 福建
ygg🤤
1 回复 分享
发布于 2023-03-05 16:36 浙江
好猛啊,我碰到的都没这么难,模版甚至没被问过
点赞 回复 分享
发布于 2023-03-03 00:25 甘肃
佬去了哪家?
点赞 回复 分享
发布于 2023-03-05 12:45 湖北
点赞 回复 分享
发布于 2023-03-05 22:28 上海
点赞 回复 分享
发布于 2023-03-06 09:18 贵州
佬去哪里实习了,大厂吗
点赞 回复 分享
发布于 2023-03-09 12:49 陕西
阿里测试开发实习招聘**************专业指导 ,招聘对象:2023年11月~2024年10月毕业的应届毕业生,详情:https://www.nowcoder.com/discuss/463759431215558656
点赞 回复 分享
发布于 2023-03-10 17:53 浙江
mark
点赞 回复 分享
发布于 2023-03-13 16:00 湖北
知乎上的严哥哥?
点赞 回复 分享
发布于 2023-03-16 10:43 四川
mark
点赞 回复 分享
发布于 2023-04-03 08:23 陕西
卧槽现代cpp我基本没被问过
点赞 回复 分享
发布于 2023-04-29 23:30 广东

相关推荐

10-28 15:42
门头沟学院 C++
查看16道真题和解析
点赞 评论 收藏
分享
11-21 22:58
已编辑
门头沟学院 自动化测试
以前面试都是聊聊家常顺嘴带一两句技术今天从自我介绍开始,看面试官们表情没什么变化的时候我就心感不妙果然在讲完之后开始质疑:你这C++经验在哪儿啊此乃第一滴汗接下来拷打一下实习内容:也没看到C++相关啊此乃第二滴汗最后反问环节我问了一下对新人如何培养的,有个面试官直接说如果想学的话现在回去就能学此乃第三滴汗而第三滴汗之后,哥们仿佛变成了一个浑身是眼儿的水气球,汗水跟井喷的石油一样滋穿了我的秋衣衬衣和外套甚至起身的时候真皮座位上有一层白雾。只能说(汗)水滴石穿,哥们再嗯的心也禁不住累计的拷打,第三滴汗带来后续的亿滴汗水持续敲打侵蚀着哥们本不坚嗯的心,在哥们心里,最后这句话仿佛在直接说:你要真想学就现在回去学别搁这唧唧歪歪。也许是哥们过度解读了,也许是哥们敏感肌了,但哥们知道自己表面上波澜不惊,内心却已经化作雪白的灰,总之哥们被最后一句话击穿了,破防了,就因为这几句质疑,哥们直接丟盔弃甲了,面试官拆穿哥们冒充C++面试者的那一秒,哥们汗如雨下浑身发冷抑郁症瞬间发作生活也仿佛没了颜色,像是吸了氪石粉的超人,被抽离尾兽的人柱力,没了光的奥特曼,被夺走腰带的假面骑士,彻底断绝了生的希望。上一次的面试通过让哥们以为自己是卫宫士郎,觉得赝品没有打不过真品的道理,冒充的C++高手未必不能和真正的C++高手碰一碰。但今天我明白我错的一塌糊涂,我根本不是卫宫士郎打红A,我是水钻碰真钻,碎的连渣都不剩。P.S.&nbsp;小杨生煎好油,但上海20块吃饱了我也确实没什么可以奢求的,祝小杨生煎生意越来越好 #面试中的破防瞬间#&nbsp;&nbsp;#牛客创作赏金赛#&nbsp;&nbsp;#面试时最害怕被问到的问题#&nbsp;&nbsp;#如何判断面试是否凉了#&nbsp;&nbsp;#24届软开秋招面试经验大赏#&nbsp;&nbsp;#秋招#
点赞 评论 收藏
分享
评论
101
696
分享
牛客网
牛客企业服务