天天看點

C++ 基礎面試題概念整理

有時候明明一些知識點是我們會的并且還能熟悉使用的,可當被人問起,卻答的七零八落的,東扯一下,西扯一些,沒有條理。所有我決定把c++中常被問起的基礎概念總結一下,希望對各位友善有用     
           

1.C語言和C++的差別

答:(1)C源檔案字尾.C,C++源檔案字尾.CPP

(2)傳回值 :C中如果一個函數沒有指定傳回值,預設傳回值類型為 int,C++如果一個函數沒有傳回值則必須指定為void,否則不會通過編譯。

(3)參數清單:C語言中如果沒有參數清單時,可以預設接受任意多個參數;但在C++中,因為嚴格的參數檢測,沒有參數清單時,預設為void,不接受任何參數。

(4)預設參數:C語言不接受參數指定預設值;C++如果給定預設參數,調用函數可以帶參,也可以不帶參,如果帶參,則使用指定實參,否則使用預設的實參。

(5)C++支援重載。

2.什麼是引用?指針和引用的差別

答:引用:給一個已存在的對象取的别名,編譯器不會為引用變量開辟記憶體空間,它和它引用的變量共用同一空間;

引用和指針的底層實作方式相同。

差別:

(1)引用在定義時必須初始化,指針沒有要求

(2)一旦一個引用被初始化為指向一個對象,就不能指向其他對象,而指針可以在任何時候指向一個同類型的對象。

(3)沒有NULL的引用,但是有NULL的指針

(4)在sizeof的含義不同,引用的結果為引用類型的大小,但指針始終是位址空間所占空間的大小

(5)引用自加改變變量的内容,指針自加改變指針的指向

(6)有多級指針,但沒有的多級引用

(7)引用比指針使用起來相對安全

3.(1)C++的三大特性是什麼

封裝,繼承,多态

(2) 什麼是封裝,什麼是繼承,什麼是多态

封裝:隐藏對象的屬性和實作細節,僅對外公開接口和對象進行互動,将資料和操作方法進行有機結合。

繼承:是面向對象程式設計使代碼複用的重要手段,允許程式員在儲存原有類特性的基礎上進行擴充,增加功能,這樣産生的新類稱為派生類

多态:字面意思:具有多種形式或形态的情形,多态性就是将接口與實作進行分離,簡單說就是實作以共同的方法,但因個體差異,采用不同政策

C++的多态分為靜态多态和動态多态

靜态多态:在編譯期間完成,編譯器根據實參的類型,可推出要調用那個函數,如果有對應的函數就調用對應的函數,否則編譯出錯。主要有函數重載,泛型程式設計。

動态多态:在程式執行的期間判斷引用對象的實際類型,根據實際類型調用相應方法。主要通過虛函數實作

4.浮點數的比較為什麼不直接用等号

答:(1)浮點數精度不同(float,double)

(2)寄存器與記憶體表示浮點數的精度不同,從記憶體加載到寄存器精度提升,從寄存器加載到記憶體精度降低,發生截斷可能改變

5.結構體為什麼要記憶體對齊

答:(1)性能問題:是一種時間和空間的權衡,以空間換時間,為了通路沒對齊的資料,處理器需要做兩次記憶體通路,而對齊隻需一次

(2)移植問題:不是所有記憶體平台都能通路任意資料的;某些平台隻能在某些位址處取某些特定的資料,否則抛出異常

6.空類對象的大小是多少,為什麼

答: 空類的大小是1,

深度探索C++對象模型是這樣說的:那是編譯器插入一個char,使得這個class的不同實體在記憶體中配置獨一無二的位址,也就是說這個char用來辨別不同對象的

7.什麼是this指針

答:類中指向目前對象的指針,指向你正在編譯的類将産生的對象。

this指針的類型:類類型*const

8.類預設的6個成員函數是

答: 構造函數,拷貝構造函數,析構函數,指派運算符的重載,取位址操作符的重載,const修飾的取位址操作符的重載

9.為什麼拷貝構造參數是同類型的引用

答:為防止拷貝構造函數的無限遞歸。

10.類中的哪些成員要放在初始化清單中初始化

(1) 引用類型的成員

(2)const資料成員

(3)類類型的成員(該類沒有預設的構造函數)

11.為什麼析構函數不能被重載

因為析構函數無參無傳回值,咋重載…

12.為什麼析構函數可以是虛函數

答:在實作多态時,當用基類操作派生類,在析構時防止隻析構基類而不析構派生類情況發生。

13.不能被重載的操作符有哪些?

答:成員選擇符,成員對象選擇符,域解析符,條件操作符

14.類的靜态成員函數可以調用非靜态的成員函數嗎?那非靜态的成員函數可以調用靜态的成員函數嗎?

答:類的靜态成員函數沒有預設的this指針,是以在它裡面不能使用任何非靜态成員;非靜态成員函數可以調用靜态成員函數,因為靜态成員函數所有類對象共享的。

15.const對象可以調用非const成員函數和const成員函數嗎?那非const的對象呢?

答:.const對象不可以調用非const成員函數,因為const修飾則該對象不可修改,調用非const會改變該對象,所有不行,但可以調用const成員函數,因為const成員函數不會修改它。

非const的對象可以調用const成員函數也可以調用非const的成員函數,因為它沒被const修飾可選擇改變也可不修改。

16.const的成員函數可以調用其他const的成員函數,非const的成員函數嗎?那非const的成員函數呢?

答: const的成員函數可以調用其他const的成員函數,可以調用指針成員變量的非const的成員函數。(不改變空間所存的位址,但可以改變解引用之後位址所存的内容)

const的成員函數可以調用其他const的成員函數,可以調用非const的成員函數

17.c++建議以const/枚舉/内聯/去代替宏,為什麼?

答:宏的優點:增強代碼的複用性,提高性能;

宏的缺點:(1).不友善調試(編譯階段進行了替換)增加了代碼的長度,可讀性差,可維護性差,而且容易誤用,還容易産生副作用

(2) 沒有安全檢測

相比之下:(1). const和内聯函數在進行時不僅 進行替換,還會進行參數類型檢測,提高程式的安全性

(2).内聯函數可以是普通函數,也可以是類的成員函數;函數式宏不能作為類的成員函數。

18.malloc/free和 new/delete的差別和聯系?

答:(1)他們都是動态管理記憶體的入口

(2)malloc/free是C/C++标準庫的函數,new/free是C++操作符

(3)malloc/free隻是動态配置設定記憶體空間/釋放空間,new/free除了配置設定釋放空間還會調用構造和析構函數初始化與清理

(4)malloc/free需要手動計算類型大小且傳回值為void*,new/free可以自己計算大小,并且傳回對應類型的指針

一定要比對使用,比對使用,比對使用,…

19.什麼是淺拷貝?什麼是深拷貝?什麼是寫實拷貝?

答:淺拷貝是編譯器直接将指針的值拷貝過來,結果多個對象共用一塊記憶體,當一個對象将這個記憶體釋放掉,另一個對象不知道這塊記憶體已被釋放掉了,以為還有效,是以對這段記憶體進行操作就會發生通路違規。

深拷貝是給新的對象重新開辟一塊和原對象一樣的空間,并把原空間的内容拷貝過來。

寫實拷貝是在需要對拷貝對象操作時,才重新開辟空間。

20.虛繼承

答:首先虛繼承是為解決多重繼承的二義性和資料備援,在繼承時用關鍵字virtual修飾,如圖:

C++ 基礎面試題概念整理

21.虛函數是什麼?虛表是什麼?

答:虛函數:在某基類中被virtual修飾的,并在一個或多個派生類中被重新定義的成員函數,為實作多态性,通過指向派生類的基類指針或引用,通路派生類中同名覆寫的成員函數。

虛表就是一張存放虛函數位址的表。

22.重載,同名隐藏,重寫覆寫的比較

答: 重載:在同一作用域,函數名相同,參數不同,傳回值可以不同,為處理功能類似而處理的資料類型不同的問題。

重寫覆寫:分别在基類和派生類中,函數名相同,參數相同,傳回值相同,基類函數是虛函數。 因為派生類繼承基類的虛函數,并且自己重寫了,在派生類的對象模型中,派生類的該虛函數就直接覆寫掉了虛表中基類的該函數。

同名隐藏:分别是在基類和派生類中,函數名相同。 因為繼承關系中基類和派生類中有一個函數名相同的,派生類對象調用該函數,編譯器會采用就近原則去在派生類找,所有就看到派生類把基類的同名函數隐藏了。

23.為什麼引入純虛函數

答: (1)為友善使用多态特性,提供接口

(2)在很多情況下,基類本身生成對象是不合理的,比如:動物作為基類派生出老虎,獅子。但動物本身構成對象是不合理的

總之:像虛函數,純虛函數和接口等,他們出現的意義,完全就不是為實作程式設計功能,而是為程式設計的易用和擴充,友善再次開發而提出的一種标準而已。

24.模闆參數和模闆的模闆參數

答:模闆參數傳參是可以是一個模闆類的類型,比如: vector< int >, 它是一個具體的類

模闆的模闆參數傳參傳的是一個模闆,比如:vector

25.C/C++程式編譯的過程

答: 1.預處理:展開宏定義,處理條件編譯指令,處理預編譯指令,删除注釋,添加行号和檔案辨別,保留所有#pragma編譯器指令。linux使用-E表示預處理

2.編譯:把預處理的檔案進行一系列 文法分析,語義分析及源代碼優化,生成相應的彙編代碼,目标代碼優化

3.彙編:将彙編代碼變成可以機器可以執行的指令,每一條彙編語句幾乎對應一條機器指令

4.連結:一大堆目标檔案,以及需要的庫檔案,最後生成可執行檔案。

繼續閱讀