C++面試知識(shí)點(diǎn)匯總(原創(chuàng))

C++面試知識(shí)點(diǎn)匯總(原創(chuàng))

整理來源:《C++程序設(shè)計(jì)語言》 Bjarne Stroustrup

存儲(chǔ)管理

  1. 靜態(tài)存儲(chǔ) static storage
    • link 期間創(chuàng)建存儲(chǔ)空間的對象 包括:
      • 全局變量
      • namespace變量
      • static 變量
    • 函數(shù)內(nèi) static 變量
      • 分配的變量只構(gòu)造一次丧枪,持續(xù)到程序結(jié)束
      • 多線程程序(共享地址空間的并行)要注意同步問題
  2. 自動(dòng)存儲(chǔ) = "放在堆棧里" automatic storage
    • 包括 函數(shù)參數(shù)句携,局部變量
    • 自動(dòng)創(chuàng)建继谚,銷毀
    • 可用 C++冗余關(guān)鍵字auto 標(biāo)識(shí)
  3. 自由存儲(chǔ) = 動(dòng)態(tài)存儲(chǔ) = "堆"
    • 包括:
      • new/delete(操作符,自動(dòng)構(gòu)造/析構(gòu))
      • malloc/free(庫函數(shù)畴椰,不自動(dòng)構(gòu)造/析構(gòu))
    • 在一個(gè)程序的整個(gè)運(yùn)行期間,自由存儲(chǔ)將不斷擴(kuò)大鸽粉,不會(huì)把存儲(chǔ)返還給 OS 供其他程序使用

auto_ptr <memory>

  • 一個(gè)模板類斜脂,支持"資源申請即自動(dòng)化"(RAII)
  • 模仿一個(gè)指針的行為,不同:退出作用域時(shí)(包括異常退出)触机,其所指對象將隱式自動(dòng)刪除(delete)
  • 破壞性復(fù)制語義(distructive copy sementics)將一個(gè) auto_ptr復(fù)制給另一個(gè)后(即賦值)帚戳,原來的 auto_ptr將不指向任何東西
  • 異常安全性:異常退出完全沒有額外開銷

C 風(fēng)格的分配 <cstdlib>

void* malloc(size_t s); // 分配 s 個(gè)字節(jié) - buffer = (char*) malloc (i+1);
void* calloc(size_t n, size_t s); // 分配 n*s 個(gè)字節(jié),初始化0 - pData = (int*) calloc (i,sizeof(int));
void* free(); // 釋放 malloc calloc分配的空間 - free (buffer);
void* realloc(void* p, size_t s); // 將 p 所指數(shù)組的大小變?yōu)?s儡首,復(fù)制到新空間片任,并釋放 p

memcpy 復(fù)制不重疊區(qū)域
memmove 復(fù)制可能重疊區(qū)域
vector 中[]和at()的區(qū)別:at()帶范圍檢查,[]不帶范圍檢查

try-catch

throw 拋出異常給(調(diào)用包含 throw 的函數(shù))的調(diào)用者

try {
    // 可能造成異常的代碼
}
catch( 某種類型的異常蔬胯,如 out_of_range ) {
    cout << "out of range\n";
}
catch( ... ) { // ...代表默認(rèn)的異常處理器
    cout << "unknown exception thrown\n";
}

class和 struct 的區(qū)別
=====================
唯一不同:struct 默認(rèn) public:(訪問描述符)对供,而 class默認(rèn) private:

const
=====
```C++
char* p = "Plato"; // "Plato"類型為 const char[6] sizeof("Plato") == 6
p[4] = 'e'; // error, 給常量賦值

成員常量
class X { public: static const int c1 = 7; ... }
常數(shù)成員函數(shù):指明該函數(shù)不會(huì)修改類的狀態(tài)

class Date {
    int d, m, y;
public:
    int day() const {return d;} // ok
    int year() const {return y++;} // error, 在 const 函數(shù)中試圖修改成員值
}
void f(Date& d, const Date& cd) { // const聲明 cd 不會(huì)在 f()中被修改(const 對象)
    int i = d.day();  // ok
    d.add_year(1);    // ok
    int j = cd.day(); // ok
    cd.add_year(1);   // error, 不能修改 const cd 值
}

非const 成員函數(shù):const 對象不可調(diào)用氛濒,因?yàn)榉?const 成員函數(shù)意味著可能被修改产场,只有 const 成員函數(shù)可以保證內(nèi)部成員不被修改
const_iterator 用于不加修改的訪問

指針和常量

const void* you; // you are a pointer to void const. *you 不可修改鹅髓,但 you 可以指向別的變量
void* const you2; // you2 are a const pointer to void. *you2 可以修改,但 you2 不可以指向其他變量
const void* const you3; // you3 are a const pointer to void const. *you3 you 都不可修改

C++的顯式類型轉(zhuǎn)換京景,不用"()"方法
static_cast<int> 相關(guān)類型的轉(zhuǎn)換
reinterpret_cast<...> 互不相關(guān)類型的轉(zhuǎn)換

物理常量性和邏輯常量性

物理:實(shí)際上就是變量
邏輯:對用戶而言是常量窿冯,但在用戶不能訪問的細(xì)節(jié)上不是常量 -> 實(shí)質(zhì)不是常量
- 用途:在常量成員函數(shù)中可能需要實(shí)際修改對象!
1. const_cast<類指針>
- 強(qiáng)制去掉對象的 const 屬性
- 缺點(diǎn):未定義行為:對 const 對象調(diào)用包含 const_cast的 const 成員函數(shù)
2. mutable 可變的
- 對可能要發(fā)生變化的成員前加 mutable(存儲(chǔ)描述符)
- 實(shí)質(zhì):對加了 mutable 的成員醋粟,無視所有 const 聲明

dynamic_cast

dynamic_cast<T>(p)
將指針 p 強(qiáng)轉(zhuǎn)為 T
類型靡菇,若轉(zhuǎn)換失敗返回0

程序終止 <cstdlib>

  • exit(0);
    1. 調(diào)用靜態(tài)對象的析構(gòu)
    2. 終止程序,將參數(shù)作為程序的返回值返回給"系統(tǒng)"
  • abort();
    不調(diào)用靜態(tài)對象的析構(gòu)米愿,直接終止程序
  • atexit(&my_cleanup) == 0 ? 終止成功 : 失敗
    my_cleanup是個(gè)無參數(shù)無返回值的自定義函數(shù)
    存在一個(gè)(由實(shí)現(xiàn)確定的)atexit()函數(shù)的最大數(shù)目
    1. 調(diào)用靜態(tài)對象的析構(gòu)
    2. 調(diào)用 my_cleanup
    3. 終止程序

extern

用于多個(gè)編譯單元(一個(gè).cpp + 與之 include 的.h)共用同一個(gè)全局變量時(shí)厦凤,(只作)聲明變量用
外部連接:一個(gè)名字在多個(gè)編譯單元間使用
內(nèi)部連接:一個(gè)名字只在定義所在的變異單元內(nèi)使用

  • 一個(gè) inline 函數(shù)必須通過完全一樣的定義,在需要用它的每個(gè)編譯單元里定義(不能加 externS丁)
  • 默認(rèn)情況下较鼓,const typedef 都是內(nèi)部連接,可加 extern违柏,因此 inline const typedef 最好都放在頭文件里

explicit 用于顯式構(gòu)造函數(shù)

單個(gè)參數(shù)的構(gòu)造函數(shù)可用"= 參數(shù)值"方式博烂,隱式調(diào)用構(gòu)造函數(shù)

class X {
    int i;
public:
    X(int ii): i(ii) { cout << i; }
    ~X() {}
}
X x = 3.14; // 先將3.14強(qiáng)轉(zhuǎn)為 int 型(3),再隱式調(diào)用構(gòu)造函數(shù) X(3)

若構(gòu)造函數(shù)定義前加上explicit漱竖,則以上隱式方法失效禽篱,必須顯式調(diào)用:X x = X(3.14);

friend 友元

  • 在類內(nèi)部生命為 friend 的函數(shù),在類外部也能訪問該類的 private 成員
  • 類似玩法:friend class X; 將類 X 所有成員函數(shù)變成友元
    實(shí)質(zhì):生命哪些是 friend馍惹,致謝 friend 能訪問 private 東西
    友元既不能繼承躺率,也不能傳遞,也沒有交換性
    protected 成員:派生類的友元可訪問

protected 基類

class X: protected Base {}; X指針試圖轉(zhuǎn)換成 Base 指針時(shí)万矾,將發(fā)生錯(cuò)誤
繼承描述符 public 悼吱,父類 public 成員 -> 子類 public 成員
繼承描述符 public ,父類 protected 成員 -> 子類 protected 成員
繼承描述符 protected良狈,父類 public 成員 -> 子類 protected 成員
繼承描述符 protected后添,父類 protected 成員 -> 子類 protected 成員
繼承描述符 private ,父類 public 成員 -> 子類 private 成員
繼承描述符 private 薪丁,父類 protected 成員 -> 子類 private 成員

register

希望做針對頻繁訪問的編譯優(yōu)化

RTTI = Run Time Type Information

dynamic_cast(RTTI 的實(shí)現(xiàn))

static(C 含義)靜態(tài)分配

  • 未初始化 局部/全局 static 變量 -> .bss段
  • 已初始化 局部/全局 staitc 變量 -> .data段
  • 聲明一個(gè)函數(shù)/變量僅僅屬于定義所在的編譯單元
    e.g.
    // file1.c
    static int glob;
    // file2.c
    static int glob;
    表示有2個(gè)不同的 glob 排他地使用
    C++用無名名字空間替代

static(C++含義)

  • 靜態(tài)成員(常量成員必須為靜態(tài))/靜態(tài)成員函數(shù)遇西,不用定義對象就能使用
  • 局部靜態(tài)存儲(chǔ)
    • 第一次調(diào)用時(shí)初始化調(diào)用構(gòu)造函數(shù),退出作用域后并不銷毀窥突,第二次調(diào)用時(shí)不會(huì)再次調(diào)用構(gòu)造函數(shù)

typeid()

運(yùn)算符努溃,獲得一個(gè)對象的確切類型

重載和覆蓋

重載 overload:同一個(gè)作用域內(nèi),相同函數(shù)名阻问,不同參數(shù)列表
覆蓋 override:派生類的函數(shù)可以覆蓋基類的同名虛函數(shù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末梧税,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌第队,老刑警劉巖哮塞,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異凳谦,居然都是意外死亡忆畅,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進(jìn)店門尸执,熙熙樓的掌柜王于貴愁眉苦臉地迎上來家凯,“玉大人,你說我怎么就攤上這事如失“砘澹” “怎么了?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵褪贵,是天一觀的道長掂之。 經(jīng)常有香客問我,道長脆丁,這世上最難降的妖魔是什么世舰? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮槽卫,結(jié)果婚禮上跟压,老公的妹妹穿的比我還像新娘。我一直安慰自己歼培,他們只是感情好裆馒,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著丐怯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪翔横。 梳的紋絲不亂的頭發(fā)上读跷,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天,我揣著相機(jī)與錄音禾唁,去河邊找鬼效览。 笑死,一個(gè)胖子當(dāng)著我的面吹牛荡短,可吹牛的內(nèi)容都是我干的丐枉。 我是一名探鬼主播,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼掘托,長吁一口氣:“原來是場噩夢啊……” “哼瘦锹!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤弯院,失蹤者是張志新(化名)和其女友劉穎辱士,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體听绳,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡颂碘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了椅挣。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片头岔。...
    茶點(diǎn)故事閱讀 40,561評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖鼠证,靈堂內(nèi)的尸體忽然破棺而出峡竣,到底是詐尸還是另有隱情,我是刑警寧澤名惩,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布澎胡,位于F島的核電站,受9級特大地震影響娩鹉,放射性物質(zhì)發(fā)生泄漏攻谁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一弯予、第九天 我趴在偏房一處隱蔽的房頂上張望戚宦。 院中可真熱鬧,春花似錦锈嫩、人聲如沸受楼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽艳汽。三九已至,卻和暖如春对雪,著一層夾襖步出監(jiān)牢的瞬間河狐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工瑟捣, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留馋艺,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓迈套,卻偏偏與公主長得像捐祠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子桑李,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評論 2 359

推薦閱讀更多精彩內(nèi)容