不知不覺,《C++面試八股文》已經(jīng)更新30篇了,這是我第一次寫技術(shù)博客,由于個(gè)人能力有限,出現(xiàn)了不少紕漏,在此向各位讀者小伙伴們致歉。
為了不誤導(dǎo)更多的小伙伴,以后會(huì)不定期的出勘誤文章,請(qǐng)各位小伙伴留意。
在《C++面試八股文:C++中,設(shè)計(jì)一個(gè)類要注意哪些東西?》一文中,
#include <iostream>
struct Foo{};
struct Goo
{
void f1(Foo& f){std::cout <<"non const function" << std::endl;}
void f1(const Foo& f){std::cout <<"const function" << std::endl;}
};
int main(int argc, char const *argv[])
{
Foo foo;
Goo goo;
goo.f1(foo); //無法通過編譯,error: ‘void Goo::f1(Foo)’ cannot be overloaded with ‘void Goo::f1(Foo)’
return 0;
}
這里的例子f1
和f2
方法的參數(shù)應(yīng)該是Foo f
和const Foo f
,這才是頂層const
。在此感謝知乎用戶 退乎 的提醒。
在《C++面試八股文:std::string是如何實(shí)現(xiàn)的?》一文中,
有std::string重載的相關(guān)問題,我已經(jīng)在 技術(shù)勘誤:《C++面試八股文:std::string是如何實(shí)現(xiàn)的?》 一文中做了詳細(xì)說明,在此再次感謝知乎用戶 莊嚴(yán) 的指正。
在《C++面試八股文:override和finial關(guān)鍵字有什么作用?》一文中,final 誤拼為 finial,感謝知乎用戶 DiaoYan 的指正。
同時(shí),這張內(nèi)存布局圖也有錯(cuò)誤,
應(yīng)該是這樣的:
感謝知乎用戶 清越 的指正。
在《C++面試八股文:std::vector了解嗎?》一文中,
面試官:
push_back
和emplace_back
有什么區(qū)別?
除了文中所說的不同點(diǎn),還要一點(diǎn):emplace_back
可以傳入構(gòu)造函數(shù)構(gòu)造對(duì)象,而push_back
只能拷貝或移動(dòng)對(duì)象。
感謝知乎用戶 選擇公理 的指正。
在《C++面試八股文:std::vector和std::list,如何選擇?》一文中,
以下代碼的輸出是什么?
#include <iostream>
#include <list>
int main(int argc, char const *argv[])
{
std::list<int> li = {1,2,3,4,5,6};
for(auto it = li.begin(); it!= li.end(); ++it)
{
if(0 == *it % 2) li.erase(it);
}
for(auto& i : li) std::cout << i << " ";
std::cout << std::endl;
}
這里給出的答案是有問題的:
erase
函數(shù)返回下一個(gè)有效迭代器,所以可以把if(0 == *it % 2) li.erase(it)
修改為if(0 == *it % 2) it = li.erase(it)
來解決這個(gè)問題。
這里的erase返回的是下一個(gè)迭代器,然后++就是下下個(gè)迭代器,跳過了下個(gè)迭代器。但是上面代碼中%2 == 0 也會(huì)跳過下個(gè)奇數(shù),所以無法暴露這個(gè)問題。應(yīng)該改成:
#include <iostream>
#include <list>
int main(int argc, char const *argv[])
{
std::list<int> li = {1,2,3,4,5,6};
auto it = li.begin();
while(it!= li.end())
{
if(0 == *it % 2)
{
it = li.erase(it);
}else{
++it;
}
}
for(auto& i : li) std::cout << i << " ";
std::cout << std::endl;
}
感謝知乎用戶 潸然 的指正。
在《C++面試八股文:什么是構(gòu)造函數(shù)?》一文中,
面試官:可以使用
virtual
修飾構(gòu)造函數(shù)嗎?二師兄:不可以,因?yàn)闃?gòu)造函數(shù)在對(duì)象構(gòu)造階段調(diào)用,虛表尚未建立,所以無法調(diào)用虛函數(shù)實(shí)現(xiàn)多態(tài)。
這里的描述是有問題的,虛表是在編譯期生成,在構(gòu)造函數(shù)執(zhí)行時(shí),可能還沒有被初始化。所以無法調(diào)用虛函數(shù)實(shí)現(xiàn)多態(tài)。
感謝知乎用戶 handsome奶酪 的指正。
在《C++面試八股文:什么是空指針/野指針/懸垂指針?》一文中,
面試官:你知道
0/NULL/nullptr
三者之間的區(qū)別嗎?二師兄:雖然三者都能定義空指針,但三者類型不同。
二師兄:
0
是int
類型,NULL
在g++下是一個(gè)宏定義,而nullptr
是有類型的;
#define NULL ((void *)0)
這里的定義也是有問題的,完整的定義如下:
#if defined (_STDDEF_H) || defined (__need_NULL)
#undef NULL /* in case <stdio.h> has defined it. */
#ifdef __GNUG__
#define NULL __null
#else /* G++ */
#ifndef __cplusplus
#define NULL ((void *)0)
#else /* C++ */
#define NULL 0
#endif /* C++ */
#endif /* G++ */
#endif /* NULL not defined and <stddef.h> or need NULL. */
#undef __need_NULL
在GCC11
下,是 __null
, 類型是long
。所以sizeof(NULL) == 8
。
再再再次感謝 莊嚴(yán) 大佬的指正。
感謝小伙伴們的的反饋,這對(duì)我來說非常寶貴。不僅幫助我改正了文章中的錯(cuò)誤,也讓我有機(jī)會(huì)更新和修正自己的知識(shí)儲(chǔ)備庫。
C++的標(biāo)準(zhǔn)繁雜,不同版本的標(biāo)準(zhǔn)可能有所出入。同時(shí)不同編譯器對(duì)標(biāo)準(zhǔn)的實(shí)現(xiàn)也不盡相同,這增加了C++學(xué)習(xí)者的負(fù)擔(dān)。
前路坎坷,吾輩不可因?yàn)榍G棘密布望而卻步。文章來源:http://www.zghlxwxcb.cn/news/detail-513945.html
關(guān)注我,帶你21天“精通”C++?。ü奉^)文章來源地址http://www.zghlxwxcb.cn/news/detail-513945.html
到了這里,關(guān)于C++面試八股文:技術(shù)勘誤的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!