面试时有一个经典问题是 “在构造函数和析构函数中能否调用虚函数”,准备面试时,我还没有系统学习 C++,故而硬背的答案:不能。记得腾讯技术终面的时候面试官也问了我这个问题,我较为熟练地说出了自己的答案,如在构造函数中能否使用的回答大致为:

不能。我想从两个方面来回答这个问题。首先一个对象的虚函数表是在其构造过程中生成,构造过程中还没有完全生成好,在这个角度看在构造函数中调用虚函数是不合理的。第二,构造过程中,编译器按照从基类到派生类的顺序依次构造,在一些阶段处于未完成状态,这时编译器会将我们的对象看做是其当前状态的类,而非目的类的当前类阶段,故不可以调用虚函数。

现在几天在看 《C++ Primer》,打算系统地学习下 C++。在 P556 页中,刚好讲到了这个问题,读起来总有些不懂的地方,于是特意上网搜索了下,搜到了份我感觉不错的代码,在这解析下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include<iostream>
class A
{
public:
A() : val(0) {test();}
virtual void func()
{
std::cout << val << std::endl;
}
void test()
{
func();
}
int val;
};

class B : public A
{
public:
B() {test();}
void func()
{
++val;
std::cout << val << std::endl;
}
};

int main()
{
A* p = new B;
p->test();
return 0;
}

自己运行了下,其结果为

1
2
3
0
1
2

解析下程序,我们首先看到在 AB 两类的构造函数中都调用了非虚函数 test(), 而 test() 函数功能则是调用虚函数 func(), 在 AB 两类中都定义了自己的 func 函数, Afunc 直接输出 val, 而 Bfunc 则先自增 val , 而后输出。

main 函数中,A* p = new B 构造了一个类 B 的对象,而将其赋给基类 A 的指针。在构造 B 的对象时,我们依次调用了 A 的构造函数和 B 的构造函数。A 的构造函数向 val 赋值为 0,并输出它,这是结果中输出 0 的缘由。在 B 的构造函数中,我们调用 this->test()test() 函数又调用了 this->func(),故调用了类 B 版本的 func() 函数,这是结果中 1 的来源。

main 函数中 p->test() 语句,由于 test() 为非虚函数,故静态绑定到了类 Atest() 函数,test() 函数调用 this->func()p->func(),为动态绑定,故绑定到类 Bfunc() 函数,故输出 2。

如此看来,在构造函数、析构函数中调用虚函数是有规律可循的,但较易出错。假若我们要使用时,一定要理解其中机制,合理谨慎设计。如果让我再回答这个问题,我较倾向回答为谨慎使用、尽量不使用。

一月初的时候在一个博客中看到了很漂亮的诗词排版,于是不会啥前端排版的我想要在自己博客中复现他。当时刚好是期末考试周,连复习的心情都么得了,狗头。

大概费了一上午的时间,终于算是实现了这个功能。当时实现好就去复习了,没有记录实现过程,今天补录下。由于刚才为了解决 Chrome 卡顿的问题删除了 Chrome 历史记录,所以这里不能提供我看到该排版的博客链接了,表示遗憾与感谢。

阅读全文 »

我出生在农历 98 年腊月十三,阳历 99 年的 1 月 29 日。因此有很多人分不清我是 98 还是 99 的,属虎还是属兔。这两年里,谷歌、腾讯、阿里先后诞生,百度弟弟也迎着 2000 年的曙光成立。我几与它们同时出生,所以我自诩为这是我的时代。我亲见了几眼上世纪最后的昼夜,经历了一场跨千年,古往今来中降落在这个时间点,也算是幸运。想来假若我能活 102 岁,或许能看到三个世纪。

阅读全文 »

            听颖师弹琴
            韩愈
昵昵儿女语,
恩怨相尔汝。
划然变轩昂,
勇士赴敌场。
浮云柳絮无根蒂,
天地阔远随飞扬。
喧啾百鸟群,
忽见孤凤皇。
跻攀分寸不可上,
失势一落千丈强。
嗟余有两耳,
未省听丝篁。
自闻颖师弹,
起坐在一旁。
推手遽止之,
湿衣泪滂滂。
颖乎尔诚能,
无以冰炭置我肠!
        

月赋
谢庄
陳王初喪應劉,端憂多暇。綠苔生閣,芳塵凝榭。悄焉疚懷,不怡中夜。迺清蘭路,肅桂苑。騰吹寒山,弭蓋秋阪。臨濬壑而怨遙,登崇岫而傷遠。於時斜漢左界,北陸南躔。白露曖空,素月流天。沈吟齊章,殷勤陳篇。抽毫進牘,以命仲宣。

仲宣跪而稱曰:臣東鄙幽介,長自丘樊,昧道懵學,孤奉明恩。臣聞沈潛既義,高明既經。日以陽德,月以陰靈。擅扶光於東沼,嗣若英於西冥。引玄兔於帝臺,集素娥於後庭。朒朓警闕,朏魄示沖。順辰通燭,從星澤風。增華台室,揚采軒宮。委照而吳業昌,淪精而漢道融。

若夫氣霽地表,雲斂天末。洞庭始波,木葉微脫。菊散芳於山椒,鴈流哀於江瀨。升清質之悠悠,降澄輝之藹藹。列宿掩縟,長河韜映。柔祇雪凝,圓靈水鏡。連觀霜縞,周除冰淨。君王迺猒晨懽,樂宵宴。收妙舞,弛清縣。去燭房,即月殿。芳酒登,鳴琴薦。

若迺涼夜自淒,風篁成韻。親懿莫從,羇孤遞進。聆皋禽之夕聞,聽朔管之秋引。於是絃桐練響,音容選和。徘徊房露,惆悵陽阿。聲林虛籟,淪池滅波。情紆軫其何託,愬皓月而長歌。

歌曰:美人邁兮音塵闕,隔千里兮共明月。臨風歎兮將焉歇,川路長兮不可越。歌響未終,餘景就畢。滿堂變容,迴遑如失。又稱歌曰:月既沒兮露欲晞,歲方晏兮無與歸。佳期可以還,微霜霑人衣!

陳王曰:「善。」迺命執事,獻壽羞璧。敬佩玉音,復之無斁。

2019 年伴随着不开心的事情到来,元旦的时候整个人都有些崩溃。 我又是有点迷信的人,觉得一件事的开端闹心那么后面也不会太好,觉得 2019 对我不太友好。幸好我是个乐天派,想到这些的时候我干脆不信这迷信就好了。毕竟在我们所认知的范围内时间是连续的,新年不过是人为主观地划分,这样一想心情算是舒慰了些。

每次展望前面要经历一段时间的时候总会觉得很漫长,而事后却觉得白驹过隙。仔细回想起来整个 2019 我也没做什么事,除去春招秋招外,大部分时间碌碌而过。总是在时间将逝的时候才倍加珍惜时间,回过头来感叹实在是浪费了太多的大好时光。不禁想起那句 “子在川上曰:‘逝者如斯夫,不舍昼夜’”。越来越觉得告别学生身份的时刻将近,尤其是在大我们一届学长拍照、收拾行装、毕业离开校园,告别学长们后,这种感觉日日加深,几乎没怎么过过大学生活的我突然很留念大学生活,想拼命地抓住它的尾巴。

阅读全文 »

TyporaAsh 主题实在是太爽了,但唯一一点美中不足就是我们在 md 中编写 html 格式时, html 编辑框的背景颜色和文字颜色几乎一样,看起来十分的晃眼,带来了不便。

要解决这个问题,我们在 ash.css 文件的 :root 下增加一行格式即好。

1
--rawblock-edit-panel-bd: #555;

因为 Ash 主题的背景为 #666,于是我选择了 #555 与它搭配。

不知道大家会不会被自己电脑桌面排列杂乱的图标给气到,作为强迫症的我在之前每次看到自己乱糟糟的桌面时就会感觉很别扭。后面就特意在桌面设了个文件夹,加图标放到里面,但这样桌面虽然整洁了点,但打开软件时就要点开文件夹,很麻烦。直到后来在大一下的时候遇到了 Wox,这个问题才得到了解决。 Wox 真的是解救我的一款软件,在解决桌面问题的同时它也意外地带来了意外惊喜 —— 改变了我使用电脑的工作方式。首先先秀一下我的桌面吧。

mark

阅读全文 »

秋招的一些经验(后台开发方向)

秋招可以说是学生时代的重要一战,秋招的成败牵系着职业的起点。想在秋招中得到心仪的 offer,正确的意识和打法就尤为重要。有很多学生以为秋招是在自己毕业后的那个秋天,到了八九月份才意识到是现在这个秋天,再慌乱地进行准备,结果可想而知了,虽不能一棒子打死,但总归不能够充分发挥出自己的实力。意识如此,打法也是这样子,有了意识,却没有正确的打法,也极有可能事倍功半。

阅读全文 »

我发现勇气根本靠不住,只有完全的疯狂才有意义。
写这篇文章时,九月画下句号,十月刚刚起笔。回忆这一个月,无数的片段涌上心头,诉说着它们的故事,有焦虑、有等待、有充实、有恐惧、有喜悦,但没有迷茫。从初中刚开始学编程的那一刻起,对大厂的渴望或许便铭刻在了我的心上。上大学以来,我越发觉得我接受不了小厂,剑指BAT,从没改变,(梦想当然是 Google),这个九月,我终于如愿了。
阅读全文 »

在地平线面试时和面试官聊到进程和线程的区别,自己说到线程切换要比进程切换快,面试官问到具体是为什么。

orz,无奈自己没有好好学操作系统,也没有复习这个。

面试官非常 nice,告诉我是因为有关 CPU 的缓存问题,其关键是 TLB。

0%