因为要离开现公司, 两个月前招到一个来接替我的小伙子, 此子只用过 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++或编程应该很有用.
接下来几天忙于搬家, 没时间长篇大论的回复了, 你们饭后茶余看看就好, 祝大家快乐学习, 开心工作!
101
opengps 2019-07-18 17:36:22 +08:00
手动翻页,他可能是来收费求学的
|
102
unco020511 2019-07-18 17:38:23 +08:00 1
楼主简直中国好员工
|
103
justou OP |
104
wutiantong 2019-07-18 17:40:40 +08:00 1
@justou 我也是一个人写的,从今年开始已经用的全是 C++17。。。
|
105
doing1 2019-07-18 17:43:41 +08:00
哇哦,牛哇,大神,膜拜中
|
106
crc8 2019-07-18 17:50:00 +08:00
中国好同事啊,楼主你带我飞吧。
|
107
shfanzie 2019-07-18 17:51:52 +08:00
虽然写了几年 C++了,lz 出的题也有些答不出来,要系统的补习下基础知识了,向 lz 学习。
|
108
tyrantZhao 2019-07-18 17:51:54 +08:00
楼主真的好人啊,但话说招 cpp 这么水吗,这不都是基础吗。。。。
|
109
yuankui 2019-07-18 18:02:08 +08:00
我操,C++有 lambda 了?
|
110
blackmirror 2019-07-18 18:15:14 +08:00
不论怎样,这付出什么尊敬
|
111
shm7 2019-07-18 18:48:54 +08:00 via iPhone
看看操作天河二号的程序员啥样子的:)
|
112
DragonQuestMaou 2019-07-18 19:08:24 +08:00
@yuankui ????你也网上冲浪啊
|
113
DragonQuestMaou 2019-07-18 19:08:39 +08:00
@yuankui ????你也网上冲浪啊哈哈哈
|
114
DragonQuestMaou 2019-07-18 19:10:17 +08:00
|
115
DragonQuestMaou 2019-07-18 19:16:04 +08:00
看了下不是很难
至少没把模板和右值引用这种东西搬出来为了出题而出题 我也觉得语言特性不重要 生态环境要重要一些 |
116
Raisu 2019-07-18 19:24:17 +08:00
楼主的内容格式很好看,只是普通的 Markdown 吗
|
117
psj1105 2019-07-18 19:47:21 +08:00
楼主态度真好
|
119
iceheart 2019-07-18 21:00:46 +08:00 via Android
lambda 只是个形式,捕获参数可以为 0 个
参考 https://zh.cppreference.com/w/cpp/language/lambda |
120
nvioue 2019-07-18 21:28:24 +08:00
我觉得吧 能改 bug 能做 feature 能编译部署 就行了 这些语法糖不是特别重要吧
有兴趣的可以自己深入. 强迫别人就不太好了 |
121
nmgwddj 2019-07-18 21:37:12 +08:00
学习了,尤其是第三题那个私有继承的解释。如果有一些编程经验,21 天精通 C++03 我认为是可能的(前 10 天 C,后面 15 天 C++,剩下 5 天例子),C++0x 就算了。但前提是你要有个好老师。
|
122
stevexu 2019-07-18 23:44:17 +08:00
楼主威武
|
123
20015jjw 2019-07-19 00:07:08 +08:00 via Android
这个题目里很多语法错误..
|
124
justou OP |
125
Mirana 2019-07-19 01:06:06 +08:00
这种题太无聊了
|
126
Actrace 2019-07-19 01:28:53 +08:00
歪个楼,读万卷书不如行万里路。
如果没有项目去做,学东西基本都是很低效的。 |
127
Actrace 2019-07-19 01:30:38 +08:00
现在很多编程语言都喜欢大量语法糖,我觉得其实有点本末倒置了。
好用的东西本身应该是简单的,语法糖太多反而会导致消化不良。 |
129
yuikns 2019-07-19 03:33:02 +08:00
其实题目还好。不过我盲猜楼主教一个有些 C 经验的人过多的理论知识,以至于对方眼中是
熟悉的熟悉的熟悉的啥熟悉的熟悉的熟悉的熟悉的熟悉的 这种状态。 该了解的被隐藏在很多熟悉的细节中。感觉这并不是很好的方法。 另外,强行 ==0 我觉得人家可能也是不太服气的,至少现在写出 0 bug 大师那种代码应该还是可以的吧。 当年我学 Scala 也是这状态,看了大半个月的 Scala 感觉晕乎乎的,感觉不能这么玩了,于是重新扫一遍目录 index 一下入口,然后直接自己想了点需求实现了几个玩具。貌似当时是给我的 alfred 写的自用功能,各种炫技想办法让自己看到的东西都实现一下。一周多感觉脑子就比较清楚了,再理理思路一两天重新看一遍书,直接上马工程。 |
130
la1850 2019-07-19 04:40:09 +08:00 via Android
没学过 c++,选择题都猜对 4 题,有编程基础学个 21 天做个 30 分问题应该不大吧。
|
131
maple 2019-07-19 04:44:12 +08:00
楼主带我吧 可能更有成就感一些 英语完全没有问题 学过 python Java,人生第一次接触 c++是上 python 前老师给了 c++的入门测试题过了。然而完全不懂~
|
132
lovestudykid 2019-07-19 05:15:07 +08:00
什么都不会也可以找工作吗,还老员工手把手教,求这么好的工作。
|
133
Poko 2019-07-19 06:56:11 +08:00 via iPhone
楼主好人,带带我吧
|
134
lisicong 2019-07-19 07:33:23 +08:00 via Android
什么公司?在哪里?楼主来招我进去啊,两个月时间,绝对给你一个船新的体验😀
|
135
lawse 2019-07-19 07:35:59 +08:00
现在可以回复了吗
|
136
keymao 2019-07-19 08:25:45 +08:00
cpp 就这样能找个人过来坐着学都挺难得。。。
|
137
gaoan000 2019-07-19 08:42:37 +08:00 via Android
最怕的就是普通人得了聪明人的懒病
|
138
justou OP |
139
weichengwu 2019-07-19 09:15:25 +08:00
歪个楼,V 站居然不支持 markdown 的 `- [ ]` 语法
|
140
pb941129 2019-07-19 09:16:47 +08:00
收藏了收藏了
|
141
justou OP @Actrace 是以完成编程任务为导向来的, 当初制定的路线大概是这样的:
1. 写一个程序来统计这个程序的词频 (其实就是任意文本文件的词频), 限定在 ascii 里面; 2. 制作静态库, 将上面的函数作为库函数; 3. 写一个类来实现相同的功能, 使用上面那个库, 增加了一些接口, 比如可以查询 top n; 4. 制作动态库, 重新设计接口, 使其能在 C 中调用; 5. 还是统计词频, 不过目标是指定路径下所有指定后缀的文件; 6. 用多线程来完成 5, 一个线程读文件, 多个线程统计, 最后合并结果 7. 强行用 Qt 加个界面吧 虽是为了深入学习故意设置的牵强任务, 但每个任务都可以辐射出大量专题, 两个月这个路线他只走到 3, 要完成后面的需要学的东西太多了, 但感觉他只是为了完成任务, 并没有在涉及到的专题上深究, 这与我的初衷完全背道而驰了╥﹏╥ |
142
raysonlu 2019-07-19 09:36:47 +08:00
所以你为什么还离职
|
144
sinopec 2019-07-19 09:52:49 +08:00
虽然一直都是 C++主语言,楼主的题也不难,但是还是要说 C++真 tmd 的事儿多,早日脱坑早日爽。
|
146
wuweijia 2019-07-19 10:16:20 +08:00
一看就会,一问就跪系列
|
147
564425833 2019-07-19 10:16:20 +08:00
楼主真的好,我要是能一入职遇到这样的师傅,真是做梦笑醒。
|
148
nealwx 2019-07-19 10:28:52 +08:00 via Android
我跟你讲,我用 return strdup 但不去 free 的,写的代码各种内存泄漏。
|
150
947211232 2019-07-19 10:34:53 +08:00
楼主,记得你女装,但还想看你女装
|
151
icefrogisgreat 2019-07-19 10:36:11 +08:00
那个新人可能过段时间会发现他曾今遇到过天使,可是他没发现
|
153
Actrace 2019-07-19 10:49:49 +08:00
@justou 不知道你有没有发现,其实很多项目做到最后用的东西,频率最高的那些部分,其实只用到了编程语言的一部分,大部分都是没用的。
|
154
wildlynx 2019-07-19 10:53:15 +08:00 via iPhone
楼主公司是做什么的,很少看到用 Qt 开发的大公司了。金山算一个
|
155
dbpe 2019-07-19 10:56:53 +08:00
求大佬的学习的方式。。。我是一个笨鸟。。。常常。。先飞了。。但是不行。。我也觉得是我学习方法有问题。。但是却又不知道在哪里
|
156
lzynb 2019-07-19 10:57:27 +08:00
楼主好人,但对一个新人来说确实有点难度
|
157
justou OP @Actrace 虽然单个项目用到的东西可能比较集中, 尤其是一些为了解决具体问题的项目, 如果设计的问题比较广, 用到的东西就比较广了, 其实从我开始编程以来, 用到最多的东西就几个方面: 数值计算的工具, 画图工具, 图像处理工具, 界面工具, 文件管理
@wildlynx 前面我放了个公司链接, 小公司, 这个 Qt 项目在我之前的同事用的 MFC 写的, 写得超级乱, 可维护性≈0, 全局变量一串一串的, 运行效率超低, 各种跑丢数据, 他自己改程序都改得吐(是真的吐了, 程序要在车上调试, 跑起来调), 我接手后他说: 你用 Qt 重新写一个吧!(啊, 说到我心里去了), 理清需求后就用 Qt 重写了. 其实他并不擅长写程序, 能写出来真是难为他了. |
158
guoyuchuan 2019-07-19 12:04:26 +08:00
原来大佬是重庆的
|
159
guoyuchuan 2019-07-19 12:04:45 +08:00
公司链接进不去
|
160
ninjachen 2019-07-19 12:23:18 +08:00
居然还有答案,楼主好人
|
161
shawndev 2019-07-19 12:29:18 +08:00
挺好的题,没做过 C 艹,看五道选择题。3、4 是我接触过的语言里没有的概念所以没做,其他三个居然都做对了。
第一题,直觉,constexpr 大概类似于 static inline 或者宏? 第二题,直觉,中括号是当前作用域的变量捕获,小括号是 lambda 的形参? 第五题,父类对象引用可以指向子类的指针? |
162
deadseven 2019-07-19 13:05:29 +08:00
楼主 tm 真是个好人,牛逼,平常人谁会这么有耐心啊,我就学不会 C++,哈哈
|
163
dajiaozi 2019-07-19 13:09:09 +08:00
楼主中国好同事啊
|
164
AmberJiang 2019-07-19 13:40:39 +08:00
楼主真的是中国好员工 有机会来成都带我吧 我英文还行 学过 python、h5、css、JavaScript 很菜 但是很喜欢编程😁
|
165
HGladIator 2019-07-19 14:18:33 +08:00
想当年要是遇到楼主的话 我现在也不止是这个样子了,当初第一家公司的状态和那小子完全一样,只会 C,做过嵌入式,却没有那小子的运气,
入职自己啃 C++ primer,一个月时间吧 勉强看完了 还是很多都不懂,所有学习全靠自己 主要还是多动脑 多动手, 还自己写了个计算器和 Windows 自带的简易版功能一样。 问领导问同事问题从来得到的回复都是你自己要学会解决问题, 我就想着我查半天才能找到答案,还不是你一句话的问题,或者给我说说方向我能查的快点儿也好啊, 现在想想真的遇人不淑,真的都是命。 |
166
dongisking 2019-07-19 14:26:33 +08:00
LZ 态度真好,要是我有这一半态度早就上天了
|
167
justou OP @HGladIator 其实都是这样折腾过来的, 我也没人带, 全靠自学, 不懂就上网搜, 在摸爬滚打的过程中壮实起来, 只不过这个过程我放在学校中完成了, 所以正式工作了很快能自己上手. 有过那种经历才知道刚起步时的弱小孤独与无助, 所以如果生活中遇到像我以前那样的人, 我肯定会毫不犹豫地拉他一把.
|
168
HGladIator 2019-07-19 14:48:00 +08:00
想知道大佬怎么快速学习的,我感觉自己的学习方法有问题,希望大佬能总结一下学习的方法论,然后怎么执行到位的。我总是没有一个很好的方法去前行,一直都是摸着走的,弯路走的太多了。
|
169
justou OP @HGladIator 我没快速学习的方法. 只有平时多总结知识, 总结以前的总结, 完善以前的总结, 不断记下自己的观点, 反复审视自己的观点, 不断改进自己的观点. 你看下主题帖第 2 个 append, 我觉得从认识论来学习更好;
至于执行, 兴趣驱动, 靠爱发电 |
170
deathscythe 2019-07-19 15:53:30 +08:00
大佬传授经验, 快记笔记!
|
171
laocp 2019-07-19 17:47:24 +08:00
A,B,D,C,C
|
172
isolove 2019-07-19 18:26:33 +08:00
楼主 能不能跟你学习一下。
|
173
joshu 2019-07-19 18:28:29 +08:00 via Android
我觉得,知道有这么个东西,写代码的时候知道可以使用
知道有这个东西,同时警惕可能会犯的错误,有查问题的能力 这两项就可以了。。 考选择题可能看不出这种能力,特别有些东西编译器会帮你纠错的 |