c++ 面試題目1-5


文章目錄


1、某文件中定義的靜態全局變量(或稱靜態外部變量)其作用域是本文件

  • 靜態全局變量限制了其作用域,只在定義該變量的源文件內有效,同一源程序的其他源文件不能使用他。

2、C++中的struct和class有什麼區別
從語法上講struct和class做類型定義時只有兩點區別:
1)默認繼承權限。如果不明確指定,來自class的繼承按照private 繼承處理,來自struct的繼承按照public繼承來處理。
2)成員的默認訪問權限。class默認的是private權限,struct默認的是public權限。

3、如何判斷一段程序是由C編譯程序還是由C++編譯程序編譯的?

#ifdef __cplusplus 
          cout<<”c++”;
#else 
         cout<<”c”;
#endif

判斷有沒有相關的預定義宏。在出現有“cplusplus ”時表示由C++編譯程序編譯。

4、C++函數中值的傳遞方式有哪幾種?
有三種傳遞方式:
1)值傳遞:形參是實參的拷貝,改變形參的值並不會影響外部實參的值。從被調用函數的角度來說,值傳遞是單向的(實參->形參),參數的值只能傳入,不能傳出。當函數內部需要修改參數,並且不希望這個改變影響調用者時,採用值傳遞。
2)指針傳遞:就是傳變量的地址賦給函數裏形式參數的指針,使指針指向真實的變量的地址,因爲對指針所指地址的內容的改變能反映到函數外,也就是能改變函數外的變量的值。
3)引用傳遞:形參相當於是實參的“別名”,對形參的操作其實就是對實參的操作,在引用傳遞過程中,被調函數的形式參數雖然也作爲局部變量在棧中開闢了內存空間,但是這時存放的是由主調函數放進來的實參變量的地址。被調函數對形參的任何操作都被處理成間接尋址,即通過棧中存放的地址訪問主調函數中的實參變量。正因爲如此,被調函數對形參做的任何操作都影響了主調函數中的實參變量。

說幾點建議:如果傳值的話,會生成新的對象,花費時間和空間,而在退出函數的時候,又會銷燬該對象,花費時間和空間。
因而如果int,char等固有類型,而是你自己定義的類或結構等,都建議傳指針或引用,因爲他們不會創建新的對象。

5、C和C++有什麼不同?
1)從機制上:c是面向過程的(但c也可以編寫面向對象的程序)c++是面向對象的,提供了類。但是,c++編寫面向對象的程序比c容易。
2)從適用的方向:c適合要求代碼體積小的,效率高的場合,如嵌入式;c++適合更上層的,複雜的; llinux核心大部分是c寫的,因爲它是系統軟件,效率要求極高。
從名稱上也可以看出,c++比c多了+,說明c++是c的超集;那爲什麼不叫c+而叫c++呢,是因爲c++比 c來說擴充的東西太多了,所以就在c後面放上兩個+;於是就成了c++。 C語言是結構化編程語言,C++是面向對象編程語言。 C++側重於對象而不是過程,側重於類的設計而不是邏輯的設計
3)從語法上現在我們常用的C語言是C89標準,C++是C++99標準的
(1)函數默認值:在C++中,定義或聲明一個函數的時候,有時會在形參中給它賦一個初始值作爲不傳參數時候的缺省值,例如:

int FUN(int a = 10);

代表沒有傳參調用的時候,自動給a賦一個10的初始值。然而這種操作在c89下是行不通的,在c語言下這麼寫就會報錯。

另外需要注意的是,賦初始值必須從參數列表的右邊開始賦值,從左邊開始賦值將會出錯

int sum1(int a = 10,int b);            //錯誤
int sum2(int a,int b = 20);            //正確

因爲如果sum1的聲明是正確的,那麼我們調用的時候怎麼調用?sum1( ,20)?很可惜這樣屬於語法錯誤,調用這麼寫既然不對那就當然不能這樣賦初始值了。相反,sum2的調用:sum2(20);合情合理,沒有任何問題。

但是,下邊的正確

int  fun(int a ,int b = 10);     //正確
int  fun(int a = 20,int b);     //正確

兩句聲明是同一個函數(函數多次聲明沒有問題),第一句已經給b了一個初始值,運行到第二句時已經等價於int fun(int a = 20,int b = 10);了。但是注意,這兩句的順序不能反轉,否則就是錯誤的

總結:C89標準的C語言不支持函數默認值,C++支持函數默認值,且需要遵循從右向左賦初始值

(2)inline內聯函數

說到內聯函數大家應當不陌生,它又是一個C89標準下C語言沒有的函數。它的具體做法和宏非常相似,也是在調用處直接將代碼展開,只不過宏它是在預編譯階段展開,而內聯函數是在 編譯階段進行處理的。同時,宏作爲預處理並不進行類型檢查,而inline函數是要進行類型檢查的,也就可以稱作“更安全的宏”。

內聯函數和普通函數的區別:內聯函數沒有棧幀的開闢回退,一般我們直接把內聯函數寫在頭文件中,include之後就可以使用,由於調用時直接代碼展開所以我們根本不需要擔心什麼重定義的問題——它連符號都沒有生成當然不會所謂重定義了。普通函數生成符號,內聯函數不會生成符號。

關於inline還需要注意的一點是,我們在使用它的時候往往是用來替換函數體非常小(1~5行代碼)的函數的。這種情況下函數的堆棧開銷相對函數體大小來說就非常大了,這種情況使用內聯函數可以大大提高效率。相反如果是一個需要很多代碼才能實現的函數,則不適合使用。一是此時函數堆棧調用開銷與函數體相比已經是微不足道了,二是大量的代碼直接展開的話會給調試帶來很大的不便。三是如果代碼體達到一個閾值,編譯器會將它變成普通函數。

同時,遞歸函數不能聲明爲inline函數。說到底inline只是對編譯器的建議,最終能否成功也不一定。同時,我們平常生成的都是debug版本,在這個版本下inline是不起作用的。只有生成release版時纔會起作用。

總結:C89沒有,在調用點直接展開,不生成符號,沒有棧幀的開闢回退,僅在Release版本下生效。一般寫在頭文件中。

(3)函數重載
C語言中產生函數符號的規則是根據名稱產生,這也就註定了c語言不存在函數重載的概念。而C++生成函數符號則考慮了函數名、參數個數、參數類型。需要注意的是函數的返回值並不能作爲函數重載的依據,也就是說int sum和double sum這兩個函數是不能構成重載的!

我們的函數重載也屬於多態的一種,這就是所謂的靜多態。
靜多態:函數重載,函數模板
動多態(運行時的多態):繼承中的多態(虛函數)。

總結:C語言不存在函數重載,C++根據函數名參數個數參數類型判斷重載,屬於靜多態,必須同一作用域下才叫重載。

(4)const
C語言中的const:被修飾後不能做左值,可以不初始化,但是之後沒有機會再初始化。不可以當數組的下標,可以通過指針修改。簡單來說,它和普通變量的區別只是不能做左值而已。其他地方都是一樣的。
C++中的const:真正的常量。定義的時候必須初始化,可以用作數組的下標。const在C++中的編譯規則是替換(和宏很像),所以它被看作是真正的常量。也可以通過指針修改。需要注意的是,C++的指針有可能退化成C語言的指針。比如以下情況:

int b = 20;
const int a = b;

這時候的a就只是一個普通的C語言的const常變量了,已經無法當數組的下標了。(引用了一個編譯階段不確定的值)

const在生成符號時,是local符號。即在本文件中才可見。如果非要在別的文件中使用它的話,在文件頭部聲明:extern cosnt int data = 10;這樣生成的符號就是global符號。

總結:C中的const叫只讀變量,只是無法做左值的變量;C++中的const是真正的常量,但也有可能退化成c語言的常量,默認生成local符號。

(5)引用:引用底層就是指針,使用時會直接解引用,可以配合const對一個立即數進行引用。

(6)malloc,free && new,delete
malloc()和free()是C語言中動態申請內存和釋放內存的標準庫中的函數。而new和delete是C++運算符、關鍵字。new和delete底層其實還是調用了malloc和free。它們之間的區別有以下幾個方面:

  • malloc和free是函數,new和delete是運算符。
  • malloc在分配內存前需要大小,new不需要。
int *p1 = (int *)malloc(sizeof(int));
 int *p2 = new int;     //int *p3 = new int(10);

//malloc時需要指定大小,還需要類型轉換。
//new時不需要指定大小因爲它可以從給出的類型判斷,並且還可以同時賦初始值
  • malloc不安全,需要手動類型轉換,new不需要類型轉換。
  • free只釋放空間,delete先調用析構函數再釋放空間(如果需要)。
  • new是先調用構造函數再申請空間(如果需要)。
  • 內存不足(開闢失敗)時處理方式不同:malloc失敗返回0,new失敗拋出bad_alloc異常。
  • new和malloc開闢內存的位置不同:malloc開闢在堆區,new開闢在自由存儲區域。
  • new可以調用malloc(),但malloc不能調用new:new就是用malloc()實現的,new是C++獨有malloc當然無法調用。

(7)作用域:C語言中作用域只有兩個:局部,全局。C++中則是有:局部作用域,類作用域,名字空間作用域三種。

發佈了90 篇原創文章 · 獲贊 37 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章