因为要离开现公司, 两个月前招到一个来接替我的小伙子, 此子只用过 C, 做了半年嵌入式, 我对他进行了两个月的 C++培训, 带着他看 C++ primer 这本书(这本书既厚又杂,想着有我帮着梳理的话亦可事半功倍, 感觉这本书不太好, 但是又没找到可替代的又是中文版的 C++入门书), 让他完成一些编程任务, 帮他 debug 并解惑, 更多的是解释原理: 为什么是这样的.
现在到考核期了, 公司要求用英文出题考核他, 题如下:
(3 points each, 15 points total)
Which one of the following C++ codes is correct C++11 expression?
const int i{3.14}
;int & i = 233
;const int& i{3.14};
constexpr double pi{3.14};
which one of the following is valid lambda expression usage?
[ ] A.
int i = 10;
auto f = [](){ return i+1;};
f();
[ ] B.
int i = 10;
auto f = [](int i){ return i+1;};
f();
[ ] C.
int i = 10;
auto f = []{ return i+1;};
f();
[ ] D.
int i = 10;
auto f = [i]{ return i+1;};
f();
What does public inheritance mean?
What does private inheritance mean?
[ ] A. Implementation details
[ ] B. Private interfaces
[ ] C. Composition
[ ] D. Is-a relationship
Suppose we have two classes(both with default constructors): class Base{...};
, class Derived: public Base {...};
, which one of the following usage is correct?
Derived* d = new Base;
Derived* d = new Base{};
std::unique_ptr<Base> ptr = std::make_unique<Derived>();
std::unique_ptr<Derived> ptr = std::unique_ptr<Derived>(new Base);
(5 points each, 25 points total)
Use range for
syntax to add 10 to each elements of the following vector
:
auto numbers = std::vector<int>{1, 2, 3, 4, 5};
Use std::for_each
to answer the previous question.
Suppose Buffer* create_buffer()
is some library function to allocate resources, and bool release_buffer(Buffer* buffer)
is the counterpart to free the allocated resources, use std::unique_ptr
to manage the resources.(hint: when the std::unique_ptr
object is out of scope, the allocated resources are automatically released.)
Suppose class Object
must have a copy constructor, a copy assign operator, a move constructor, a move assign operator and a destructor, write down their signatures .
RAII is a key C++ programming technique, write down your understanding of RAII (not the literal meaning)
我参考当初他问过的问题以及给他的解答出的, 当然考核只是个形式, 所以我直接把题给他先看看, 让他先尝试着做, 结果一题不会! 苦口婆心两个月 == 0.
有一些想法:
考核肯定是过不了的了, 最后估计会留在公司打杂, 因为最近又招了个新的人, 还没来报道, 看简历是个硕士, 虽然没写过 C++, 但会 python 跟 java, 在学校也搞过正儿八经的研究. 这个带起来应该能很快起飞, 但已经等不到了, 今天是在该公司的最后一天, 只能祝福着这位"带不动同事", 平静地离开了.
D
考察对C++11 Uniform Initialization的理解
AC都是相同错误, 花括号初始化不允许有精度丢失的隐式转换, AC都将编译出错; 坚持使用花括号初始化变量, 一定程度上能避免隐式转换带来的bug, Explicit is better than implicit! B是C的干扰项, 同事很爽快的选中了C, 因为他确定不能像B这么干
D
C++ 的lambda着重给同事讲过, 告诉他原理可以看成是生成了一个只有编译器知道的匿名的可调用类(实现了operator()
), 捕获列表[]里有东西的话相当于这个类有字段, 捕获方式则决定了这些字段是如何初始化的, lambda的参数列表相当于operator()
的参数列表. 把这些对应关系搞清楚了就不用去死记硬背lambda有几种写法了. A的return i + 1
的i
未定义, B的f
调用需要参数, C是A的干扰项, 同事觉得C肯定不对, 连括号()都没得, 选A! 公司Qt项目中大量使用lambda作为槽函数.
D
公有继承表示的是“is-a”的关系, class Dog: public Animal ...
, Dog
是Animal
A
私有继承 class Television: private Radio
, 电视机不是收音机, 只是想用收音机里面的一些现成的可用的功能, 电视机并不想让别人知道它借用了收音机的东西, 所以用私有继承, 是一种实现细节. 其实这是一种不太好的方式, 到处搜刮现成的实现来强行塞进来, 屎山不是一日建成的; 其实当想用C++的继承时就得三思是否可以构建一个健壮的继承层次, 设计的时候多考虑组合或者继承接口, 给同事讲解一个项目中某个地方为啥要用继承来实现时区分的两种继承方式, 他依稀记得是说过, 但是忘记了, 更糟糕的是他根本不认识里面的任何关键字单词...
C
通过基类指针来操纵子类实例啦. 同事一眼选中A, 他觉得B选项Base
后面怎么能有个花括号, CD这么长, 先排除了
其实通过跟他对每个选项的讨论, 我知道他只是想挑出正确答案, 并不是想搞清楚不对的选项为什么不对, 他的关注点完全不在考察点, 不理解这道题的意图, 当然很容易踩中故意设计的陷阱, 他也没辜负我出题时的坏心思, 所有陷阱全踩了
for (auto& number: numbers){
number += 10;
}
std::for_each(numbers.begin(), numbers.end(),
[](int &number){ number += 10;});
auto ptr = std::unique_ptr<Buffer, decltype(&release_buffer)>(
create_buffer(), release_buffer);
class Object{
Object(const Object& obj); // copy constructor
Object& operator= (const Object& rhs); // copy assign operator
Object(Object&& object); // move constructor
Object& operator= (Object&& rhs); // move assign operator
~Object(); // destructor
};
RAII的思想为: 在构造器中获取资源, 建立类的不变量(invariant), 在析构器中释放获取过的资源; 通过使用局部变量这种方式来管理资源, 当局部变量出作用域时, 获取的资源将被变量的析构函数自动释放
题跟答案都是根据自己的理解编造的, 欢迎提出不同的观点
统一回复下"求带, 求指导"朋友:
本人随时处在繁重的学习当中, 几乎是没时间的, 通过网络指导的话效率也太低了, 彼此的时间不应该这样浪费;
学编程的话没有太多诀窍, 多看多练多写多想, 我觉得最忌讳的是去死记硬背(但你通常可以通过思维导图来整理一些重要细节帮助理解记忆);
多问"为什么", 知识是客观存在的, 乃死物, 多问问它的来龙去脉, 怎么来的, 为什么要这样, 这样有什么好处, 如此这般才能接触到事物的真相和本质. 举个不太恰当的例子: 2019年7月19号早上你发现你家门口有一只陌生的猫, 如果只停留在表象"哇, 今早我家门口有只猫", 这件事可能你很快就忘了, 忘记了是哪天, 忘记了这只猫的颜色, 甚至忘记了在家门口见到一只猫的事情...如果多提出一些疑问: 这只猫哪来的? 什么品种? 公的母的? 猫主人是谁? 你甚至好奇的尾随它到了另一户人家门口, 发现猫的主人是个漂亮的姑娘, 以此发生了一段美妙的邂逅...之后你回忆起来, 这些场景历历在目, 如数家珍地跟自己的孩子讲述着你跟孩子他妈邂逅的过程...
其实学知识很大程度上是在学历史, 这些知识不是平白无故出现的, 是为了解决具体问题而提出来的, 是从生活实践中抽象出来的, 所以很有必要了解其背景, 这样才能在运用知识上得心应手, 因为你清楚它的应用场景, 适用条件. 以C++来举例, C++一直在发展, 不断提出新标准, 新语法, 不断扩充的标准库, C++越来越臃肿遭人诟病, 太多的语法糖, 越来越难使用. 其实这个时候换一个角度看问题就好了: 为什么提出这个新语法? 出发点是什么? 解决了以前的什么痛点?为什么这样更好? 这可能需要你去关注标准委员会的动向, 他们的讨论, 他们的决策, 当然你也可以通过一些书籍文章了解到这些东西. 虽然可能不会去用新特性, 但是可以学到一些解决问题的思路, 一些设计理念. 也千万不要强行用上新特性(出于了解学习目的是可以的), 不能为赋新词强说愁, 个人认为使用新特性最好的时机是发现某个新特性正好解决了你的一些痛点.
这第3点是自己这些年来自学的一些心得. 我是物理学出生, 但是专业学得稀烂, 很大程度上是因为接受不了那些突兀的, 毫无生机的, 压缩饼干似的知识. 以前学校的老师只是负责把这些东西分发给你充饥, 很显然我不屑于吃, 最后是饿死的. 后来, 尤其是工作这两年, 重新审视物理跟数学, 发现他们其实是一部超级燃的历史小说, 每个重大的理论定理后面都有一段脍炙人口的故事, 难怪以前有些老师让我们多看课外书, 扩充知识面, 我想他们说的课外书, 就是这些"历史书"吧, 当初一直错误地认为是"xxx题典", 这些方法论的花招式更多时候只有打发时间之用, 更重要的是知识的起源, 从历史的角度, 从认识论的角度来探讨知识, 这样才能真正修炼成自己的内功.
还是让自己可以流畅的读英文吧, 我对带的同事提升英语阅读的建议是: 你不是比较熟悉C嘛, 找一本C语言的英文的书, 从头开始看, 里面讲的东西你都比较熟悉了, 所以侧重点就在于看英语是怎么表达的, 学习专业词汇, 咬文嚼字地看, 坚持看完这样一本, 你以后就无所畏惧了. 一言蔽之: 找一本你熟悉的感兴趣的主题的英语书看完.
最后推荐一些个人喜欢的站点, 对C++或编程应该很有用.
接下来几天忙于搬家, 没时间长篇大论的回复了, 你们饭后茶余看看就好, 祝大家快乐学习, 开心工作!
1
deepred 2019-07-18 13:25:51 +08:00 12
哪有这么好的同事,还帮辅导你 c++
|
2
fhsan 2019-07-18 13:25:54 +08:00
哦,以前交接的时候劝退过好几个新同事,吓得我以后交接的时候不敢讲太多。
|
3
Vegetable 2019-07-18 13:26:00 +08:00 4
楼主好人
|
4
515576745 2019-07-18 13:29:06 +08:00 via Android 2
做笔记是最好的学习方式。
|
5
jdhao 2019-07-18 13:32:57 +08:00 via Android
楼主的英语表达不错,你的同事水平太差,不值得你费劲,这些问题自己自学应该就能搞定
|
6
tankren 2019-07-18 13:37:49 +08:00
楼主好人
|
7
VoidChen 2019-07-18 13:38:01 +08:00
话说 c++入门确实不好弄,之前工作需要要写一点,边看资料边写,结果一个地方传完参数忘了回收,结果就内存溢出了(压测对的时候才发现)。。。
|
8
wsseo 2019-07-18 13:38:05 +08:00
我怎么没遇到这样的好人。
|
9
Skypemifan 2019-07-18 13:39:22 +08:00
确实好人
|
10
geelaw 2019-07-18 13:39:42 +08:00 via iPhone 5
抬个杠:不存在 single-choice question 这种表达,直接说 multiple-choice question 就行。
|
11
zxq2233 2019-07-18 13:40:48 +08:00
楼主是小姐姐
|
12
Skypemifan 2019-07-18 13:42:27 +08:00
c++ primer 确实又多又杂 哈哈哈哈 明天我也要离职了
|
13
LxExExl 2019-07-18 13:42:45 +08:00
惭愧 cs 科班出身 工作 2 年
现在一个题都做不出来了 |
14
crisfun 2019-07-18 13:43:38 +08:00 via iPhone
英语真简单啊
|
15
msaionyc 2019-07-18 13:47:51 +08:00
态度问题,这题只要两个月没全部划水,怎么说几个选择题能选出来吧
|
17
atom234 2019-07-18 13:56:21 +08:00
建议楼主去辅导我的以为新同事,手动🐶头
|
18
kidlfy 2019-07-18 13:57:44 +08:00
emmmm 最近也在看这本书 惊觉我和那位大兄弟竟然一样的学习方法....在书里勾勾画画....所以有大神给个答案吗
|
19
janus77 2019-07-18 13:57:52 +08:00
你还辅导?要是我就一句话:自己弄懂,到时候要考,不过就走人吧
然后看不看随他了,反正又不是我被开 |
20
fy1993 2019-07-18 14:02:54 +08:00
楼主真心好人, 不过感觉你这同事不值得你这么费心的去带
|
21
lucifer9 2019-07-18 14:07:18 +08:00
为啥要招个只用过 C 完全没 C++ 经验的呢
|
22
a566 2019-07-18 14:09:37 +08:00
好人啊 我怎么遇见不到啊
|
23
bzshow1 2019-07-18 14:14:30 +08:00
楼主招我吧
|
24
Otho 2019-07-18 14:14:41 +08:00
太依赖了
|
25
bayker 2019-07-18 14:20:37 +08:00
楼主在哪,能拜你为师吗,真心的
|
26
pyscream 2019-07-18 14:21:39 +08:00
所以能贴个答案吗,感觉自己也答不上几道
|
27
justou OP |
28
justou OP 我看这个同事每天看书挺带劲儿的, 以为他在很认真的看, 或许是真的在很认真的看, 但是知识吸收率太低了
|
29
poplar50 2019-07-18 14:25:47 +08:00 via Android
楼主好人 两个月时间培训相比我们公司要求你啥都得飞速上手真的羡慕了
|
30
justou OP |
31
chaffy 2019-07-18 14:33:48 +08:00
这么好楼主哪里找
|
32
silverbooker 2019-07-18 14:35:54 +08:00
一题都不会可还行……菜的真实。
|
33
Earl 2019-07-18 14:36:31 +08:00
lz 好人。
如果闭卷的话,我觉得一个才接触 c++两个月的,这些题目的确不一定能做出来。主要很多东西意思明白,但是正确的语法可能记不全。 如果开卷的话,这些题目就不算难了。 |
34
perfectlaugh 2019-07-18 14:37:29 +08:00
试试看解答 要不然我的 C++都要生锈了
1. D 2. A 3. D 4. C 5. C 1. ``` for (auto& number: numbers) { number += 10; } ``` 2. ``` std::for_each(numbers.begin(), numbers.end(), [](auto& number) { number += 10; }); ``` 3. ``` class Object { Buffer* _buf; public: Object() { _buf = create_buffer(); } ~Object() { release_buffer(_buf); } // It is better to use operator* though... Just in case Buffer* get_buf() { return _buf; } } // std::make_unique<Object>(); ``` 4. ``` class Object { //copy constructor Object(const Object& _other) { } //move constructor Object(Object&& _other) { } //copy assignment operator operator=(const Object& _other) { } //move assignment operator operator=(Object&& _other) { } //destructor ~Object() { } } ``` 5. Resource Acquisition Is Initialization Using OOP constructor and destructor to let resource allocate and deallocate properly. (?) |
35
EthanDon 2019-07-18 14:38:43 +08:00
@justou 5555 复读过的人真心深有体会,学习方式、思维方式真的占了成绩大头!良好的学习方式和思维方式加上努力是个人都能上重本,稍微聪明一点再努力一点的都能上 211 了!
复读的时候到了某个高考工厂,老师教了一套学习方法,自己又悟出来一点,成绩可谓突飞猛进!现在每每看到有人写方法论都会搜藏下来,平时自己也喜欢总结一下方法。 |
36
perfectlaugh 2019-07-18 14:38:46 +08:00
哎 上面的 operator 忘了 void...
|
38
Yourshell 2019-07-18 14:39:36 +08:00
一题都不会,没学过 cpp
|
39
ooee2016 2019-07-18 14:43:57 +08:00
公司真抠
|
40
sangleft 2019-07-18 14:44:08 +08:00
一题都不会是过分了。
两个月啃了十章多 primer,还是有不会的题,把书读薄确实不容易啊。。 |
41
justforlook44444 2019-07-18 14:45:09 +08:00
@justou
看 C++ primer 第三版我觉得好点。 |
42
Woood 2019-07-18 14:46:15 +08:00
从你提离职到你可以走,就一个月时间,带的人能不能接手雨女无瓜
|
43
perfectlaugh 2019-07-18 14:46:34 +08:00
没人推荐 cppreference.com 🐎
|
44
sangleft 2019-07-18 14:48:11 +08:00
@perfectlaugh 第二是 D 吧?
|
45
Aoerz 2019-07-18 14:49:06 +08:00 via Android 3
|
46
perfectlaugh 2019-07-18 14:50:33 +08:00
@sangleft 这是 closure 不是一般的函数 closure 可以拿当前函数的变数
|
47
perfectlaugh 2019-07-18 14:53:02 +08:00
xswl 这个图
|
48
cxyfreedom 2019-07-18 14:53:20 +08:00
凭以前 C 的经验,前四个应该是 DDDC 吧,后面不知道了
|
49
legiorange 2019-07-18 14:54:15 +08:00 via Android
@justou 还招 java 吗。。kotlin groovy 都会的那种。。
|
50
perfectlaugh 2019-07-18 14:55:10 +08:00
@sangleft 完了 应该是 D
|
51
perfectlaugh 2019-07-18 14:55:21 +08:00
写太多 rust 导致错乱
|
52
perfectlaugh 2019-07-18 14:56:39 +08:00
|
53
justou OP @Woood 学到个新词: 雨女无瓜. 今晚公司要开欢送会, 发现出场人员名单没他, 然后问了下之后怎么安排他, 听说是辞退, 原来又新招的人是替他的了_(:з」∠)_
|
54
RorschachZZZ 2019-07-18 15:01:18 +08:00
我在上家公司交接工作,吓跑了俩新同事。。最后负责我原来工作的新同事也在交接完成后不久就走了。。。
|
55
RockOrRoll 2019-07-18 15:07:37 +08:00
教练,我想学 C++
|
56
maguazhou 2019-07-18 15:07:39 +08:00
选择题,蒙阿
|
57
zjddp 2019-07-18 15:08:38 +08:00
这么好的前辈上哪找去
|
58
justou OP @bzshow1
@legiorange 发个公司链接 http://zhiqiankeji.cn/ 不过我已经走了, 公司也没人会写 C++了, 用 C++是必须的. 进来好处是太多空闲时间, 随意充实自己, 人都很好相处, 二十几岁的小姐姐不少, 有几个还是单身; 坏处也是太多空闲时间, 没啥具体的事干, 还有个坏处是已经没人带了, 进来只能自己摸索, 也许会荒废自己. 已经没利益相关了, 靠情怀推广一下 |
59
sangleft 2019-07-18 15:13:38 +08:00
@perfectlaugh 触及盲点。。敲了一下 AC 是同样的错没有捕获到变量 i,B 是调用时缺少参数,D 是啥错了呢。。
|
60
justou OP 记得公司好像一直想搞移动端的服务, 也需要会 java 的童鞋, C++是算法组必须的, 软件组 C#, java 应该都需要
|
61
richzhu 2019-07-18 15:15:08 +08:00
大哥 还收小弟不? 我去... 肯定鞍前马后~
|
62
perfectlaugh 2019-07-18 15:16:30 +08:00
哎 还是得实际执行 算学习到了
|
63
perfectlaugh 2019-07-18 15:16:55 +08:00
多亏我之前用这么多 lambda 结果连名字都没得好好记
|
64
vx2018 2019-07-18 15:23:22 +08:00
DDDCC
for (int& i : numbers){i += 10;} std::for_each(numbers.begin(), numbers.end(), [](int& i) {i += 10; }); 能拿几分 hhhh |
65
Yiki 2019-07-18 15:35:42 +08:00
天哪没什么感觉
就觉得楼主人真的太好了…… |
66
jaycee110905 2019-07-18 15:39:29 +08:00
楼主中国好员工
|
67
fvckDaybyte2 2019-07-18 15:40:22 +08:00 via iPhone
会不会只是看不懂英语而已……
|
68
skadi 2019-07-18 15:52:54 +08:00
不算难,理解要到位...
|
69
111qqz 2019-07-18 15:53:07 +08:00 via Android
楼主好人一生平安
|
70
hx1997 2019-07-18 15:53:22 +08:00 via Android
@fvckDaybyte2 不是啦,楼主说了“英文太差, 其实一开始题都没读懂, 我一个个地解释了一遍, 还是不会做;”
|
71
GPIO 2019-07-18 15:53:42 +08:00
2 个月时间 C 转 C++比较困难,而且还包含了 C++11/14 的内容,不过他一点都不会只能说他真的是个废柴。
|
72
hmzt 2019-07-18 15:53:58 +08:00 1
个人看法,你出的题大多没有意义,语言特性只是工具,不用 c++11 和 lambda 就实现不了想要的功能吗,至于检查语法错误,ide 要比人做的更好,学习语言,靠别人教很难学到,写多了自然就会了
|
73
ql 2019-07-18 16:06:18 +08:00
好人啊, 这样的大哥哥少见!
|
74
kakudesu 2019-07-18 16:12:08 +08:00
肯耐心教人真的不多,但是遇到不学的真的没办法
|
75
youngster 2019-07-18 16:19:44 +08:00
好人啊,要我才懒得教他
|
76
GeruzoniAnsasu 2019-07-18 16:27:37 +08:00
@hmzt 看题主描述的上下文啊,这个人是要接他的代码的,总不能我代码用到的语言特性接手的人全不懂,那咋接
|
77
missdeer 2019-07-18 16:29:14 +08:00
虽然看着是日常能用上的,但对新人来说感觉略难,毕竟才 2 个月,又不是上学的时候还能死记硬背过考试
|
78
deming 2019-07-18 16:31:28 +08:00
是女同事吗?很漂亮的那种,如果是,那么通宵达旦、手把手得教 都不够!
|
79
YourLord 2019-07-18 16:31:29 +08:00
@RorschachZZZ 招人给我让我给分点杂货,都是最简单的,然后连续跑了 2 个说是做不了……
|
80
fademeter 2019-07-18 16:32:51 +08:00 via Android
楼主应该是一个很有耐心的人,看这么长一段,哈哈😄
|
81
tabris17 2019-07-18 16:33:53 +08:00
我猜第一题选 D
pi{3.14}是什么语法? |
82
Cloutain 2019-07-18 16:34:54 +08:00
哪位兄弟翻译一下,我也来做做题
|
83
cllvking 2019-07-18 16:35:40 +08:00
楼主好人
|
84
stone666 2019-07-18 16:37:28 +08:00
楼主,想看你女装
|
85
karllynn 2019-07-18 16:38:16 +08:00
重庆的公司。。招不到搞 IT 的太正常了
|
86
dabaibai 2019-07-18 16:39:29 +08:00
英文题目 略过
|
87
way2create 2019-07-18 16:44:50 +08:00
想起我框架写的多了 原生的会但用的少 一次笔试很简单的东西一时脑抽写错了 不过当时是被坑货 hr 的奇葩答卷方式搞的怪紧张的
|
89
mzdblsw8 2019-07-18 16:46:58 +08:00
我感觉回到了上学的时候。人各有志。他愿意这样就随他。你自己的事情做完就走就好了。二个月要人学会也不容易啊。
|
90
avaJ 2019-07-18 16:50:22 +08:00
好人
|
91
salamanderMH 2019-07-18 17:00:57 +08:00
要去超算中心了
|
92
lrxiao 2019-07-18 17:01:49 +08:00
D initializer_list 不能 narrowing
D 省个括号的语法并要 capture D IS-A 吧 A 不会.. C unique_ptr 的一个 ctor overload 就是为了模拟这里的 covariant for (auto& x) for_each(begin(), end(), [](int& a){ a+=10; }) make_unique(T*, delete_buffer) 用 unique_ptr 的自定义 deleter 略 略 |
94
ByCen 2019-07-18 17:09:27 +08:00
好员工
|
95
Anshi 2019-07-18 17:16:23 +08:00
天呐 最近我也在看 c++ primer 楼主好人带带我吧。。2333
|
96
wutiantong 2019-07-18 17:20:07 +08:00
关于第四题吧,仔细考教的话 :
class D : B {}; class D { B b; }; 还是不一样的,后者才是真正意义上的 Composition |
97
neroxps 2019-07-18 17:24:56 +08:00
|
98
shfanzie 2019-07-18 17:32:47 +08:00
@neroxps
@justou 还真有《 Teach Yourself C++ in 21 Days, Second Edition 》这本书,还第 2 版了。 http://101.lv/learn/C++/ |
99
ahswch 2019-07-18 17:35:27 +08:00
lz 也太好了叭。我枯了。啥时候有大佬带我 2 个月 2333
|