C++面試常見問題補充

轉載知乎博主總結:

C++面試常見問題

補充:

1. 指針常量(int *const p)和常量指針的區別(const int *p、int const *p)?

指針常量:本質上是一個常量,指針用來說明常量的類型,表示該常量是一個指針類型的常量。在指針常量中,指針自身的值是一個常量,不可改變,始終指向同一個地址,在定義的同時必須初始化。(指向的地址是一定的,但其內容可以修改)

常量指針:本質上一個指針,常量表示指針指向的內容,說明指針指向一個“常量”。在常量指針中,指針指向的內容是不可改變的,指針好起來好像指向了一個常量。(指針可以指向其它地址,但其內容不可以改變)

2. 深拷貝和淺拷貝的區別?

淺拷貝:只是對指針的拷貝,拷貝後兩個指針指向同一個內存空間。

深拷貝:不但對指針進行拷貝,而且對指針指向的內容進行拷貝,拷貝後的指針是兩個不同地址的指針。

當對象中存在指針成員時,淺拷貝帶來的問題本質是析構函數釋放多次內存,可使用std::shared_ptr解決這個問題。

3. 類的三個基本特徵是什麼、類的類型兼容規則是什麼?

封裝:代碼模塊化

繼承:代碼重用

多態:接口重用

1) 派生類對象可以隱含轉換爲基類對象;

2) 派生類對象可以初始化爲基類的引用;

3) 派生類的指針可以隱含的轉換爲基類的指針;

4. 指針和引用的區別?

相同點:都是地址的概念,指針是指向一塊內存,內容是指向內存的地址;引用是某塊內存的別名。

不同點:

1) 指針是一個實體,而引用是一個別名;

2) 引用在使用時無需解引用(*),指針需要解引用;

3) 引用只能在定義時初始化一次,之後不可變;指針可變;

4) 引用沒有const,指針有const;

5) 引用不能爲空,指針可以爲空;

6) sizeof 引用得到的是變量(對象)的大小;而sizeof指針得到本身大小;

5. 右值引用和move語義

1) 左值和右值的區別:

    左值是表達式結束後依然持久存在的對象;

    右值是表達式結束後不存在的臨時對象;

    區分左值和右值的方法:是否能對錶達式取地址,如果能,則爲左值,否則爲右值。

2) C++11特性中用&表示左值引用,用&&表示右值引用;

3) move語義允許一個對象在特定的情形下,取其它對象的資源;

6. 普通函數可以釣魚const函數,也可以調用非const函數,但是const對象只能調用const函數

7. 函數指針和指針函數的區別?

1) 函數指針 :一個函數總是佔用一段連續的內存區,函數名作爲所佔內存區首地址,把首地址賦予一個指針變量,指向該函數,通過指針變量調用這個函數。//   int (*f) (int x); 

2) 指針函數:返回值是一個指針(即地址);  //int *func(int a)

8. 內存分爲哪些區?

堆(後進先出)、棧(先進後出)、全局區(靜態區)、文字常量區、程序代碼區

9. static關鍵字的作用

1) 函數體內static變量作用範圍爲該函數體,不同於auto變量,內存只分配一次,下次調用仍爲上次的值。

2) 模塊內static變量可以模塊內訪問,不能被模塊外訪問;

3) 模塊內static函數限制模塊內;

4) 類型static成員變量屬於整個類,只有一份拷貝;

5) 類中static成員函數屬於類,只能訪問static成員變量,不接受this指針;

10. inline內聯關鍵字的作用

1) 函數調用時代碼替換(省去調用開銷,效率高,但佔用空間開銷)

2) 變量自動替換(代碼中形參和實參替換)

11. 禁止異常傳遞到析構函數中的原因:

1) 能夠在異常傳遞的堆棧碾轉開解的過程中防止terminate被調用;

2) 幫助確保析構函數總能完成我們希望它做的事;

12. 兩個map進行拷貝:先swap,然後std::copy()

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章