C++面試八股文:技術勘誤
在《C++面試八股文:C++中,設計一個類要注意哪些東西?》一文中,
#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
方法的引數應該是
Foo f
和
const Foo f
,這才是頂層
const
。
在《C++面試八股文:std::string是如何實現的?》一文中,
有std::string過載的相關問題,我已經在 技術勘誤:《C++面試八股文:std::string是如何實現的?》 一文中做了詳細說明。
在《C++面試八股文:override和finial關鍵字有什麼作用?》一文中,final 誤拼為 finial。
同時,這張記憶體佈局圖也有錯誤,
應該是這樣的:
在《C++面試八股文:std::vector瞭解嗎?》一文中,
面試官:
push_back
和emplace_back
有什麼區別?
除了文中所說的不同點,還要一點:
emplace_back
可以傳入建構函式構造物件,而
push_back
只能複製或移動物件。
在《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
函式返回下一個有效迭代器,所以可以把if(0 == *it % 2) li.erase(it)
修改為if(0 == *it % 2) it = li.erase(it)
來解決這個問題。
這裡的erase返回的是下一個迭代器,然後++就是下下個迭代器,跳過了下個迭代器。但是上面程式碼中%2 == 0 也會跳過下個奇數,所以無法暴露這個問題。應該改成:
#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++面試八股文:什麼是建構函式?》一文中,
面試官:可以使用
virtual
修飾建構函式嗎?二師兄:不可以,因為建構函式在物件構造階段呼叫,虛表尚未建立,所以無法呼叫虛擬函式實現多型。
這裡的描述是有問題的, 虛表是在編譯期生成,在建構函式執行時,可能還沒有被初始化。所以無法呼叫虛擬函式實現多型。
在《C++面試八股文:什麼是空指標/野指標/懸垂指標?》一文中,
面試官:你知道
0/NULL/nullptr
三者之間的區別嗎?二師兄:雖然三者都能定義空指標,但三者型別不同。
二師兄:
0
是int
型別,NULL
在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
。
C++的標準繁雜,不同版本的標準可能有所出入。同時不同編譯器對標準的實現也不盡相同,這增加了C++學習者的負擔。
前路坎坷,吾輩不可因為荊棘密佈望而卻步。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70034822/viewspace-2992118/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 《Oracle核心技術》勘誤——個人閱讀Oracle
- 「iOS 面試之道」勘誤(二)iOS面試
- 技術面試官的9大誤區面試
- 【BAT機器學習面試題】前100題彙總及勘誤(上)BAT機器學習面試題
- RedHat-勘誤列表(轉)Redhat
- 面試題分享---面試八股文面試題
- 《演算法4》勘誤表演算法
- 吃透Redis面試八股文Redis面試
- 聊聊技術面試 | 掘金技術徵文面試
- 技術面試(一)面試
- C++的技術C++
- 技術面試聖經《Cracking the Coding Interview》題解C++版面試ViewC++
- 從一道 iOS 面試題到 Swift 物件模型和執行時細節——「iOS 面試之道」勘誤iOS面試題Swift物件模型
- 朱棣文演講的翻譯勘誤
- 技術面試已死面試
- C++的引用技術C++
- 騰訊面試八股文12-29面試
- 三天吃透RabbitMQ面試八股文MQ面試
- 三天吃透MySQL面試八股文MySql面試
- 三天吃透mybatis面試八股文MyBatis面試
- 三天吃透Kafka面試八股文Kafka面試
- 三天吃透Redis面試八股文Redis面試
- 《普林斯頓數學指南》勘誤
- 《數學分析八講(修訂版)》勘誤
- Java面試之技術框架Java面試框架
- 技術面試通用方法論面試
- 中聯綠盟面試技術題面試
- 技術面試 android部分面試Android
- 三天吃透Spring面試八股文Spring面試
- 一天吃透Git面試八股文Git面試
- 一天吃透MySQL面試八股文MySql面試
- 一天吃透Redis面試八股文Redis面試
- 一天吃透JVM面試八股文JVM面試
- [ChatGPT 勘誤] 關於 CL_WB_PGEDITOR 的用途ChatGPT
- MIDI檔案格式分析(補充和勘誤)
- Effective Java Second Edition中文版勘誤列表Java
- 我的新書《程式設計之法:面試和演算法心得》終於上市 [內含勘誤]新書程式設計面試演算法
- 技術晉升的誤區