1. 程式人生 > >C++面試總結(一)常用關鍵字

C++面試總結(一)常用關鍵字

1.簡述volatile的用法

   有些變數是用volatile關鍵字宣告的。當兩個執行緒都要用到某一個變數且該變數的值會被改變時,應該用volatile宣告,該關鍵字的作用是防止優化編譯器把變數從記憶體裝入cpu暫存器中。volatile的意思是讓編譯器每次操作該變數時一定要從記憶體中真正取出,而不是使用已經存在暫存器中的值。

2.簡述extern的用法

   (1)在c++中,用來指定使用另一語言進行連結,這時需要與特定的轉義符一起使用。

extern "c" 宣告語句
extern "c" {宣告語句塊}

 告訴編譯器該段程式碼以C語言進行編譯。

 (2)extern string lpdd;

  宣告lpdd,但是不分配記憶體,只說明他是你可以用的變數,在此程式之外其他的程式中已經聲明瞭它。其實它就是防止名字衝突。被其修飾的變數(外部變數)是靜態分配的,即程式開始時分配,結束時釋放。

  extern的原理很簡單,就是告訴編譯器:“你現在編譯的檔案中,有一個識別符號雖然沒有在本檔案中定義,但是它是在別的檔案中定義的全域性變數,你要放行!”

//A.cpp

extern int i;

int main()

{

i=100;//試圖使用B中定義的全域性變數

}

//B.cpp

int i; //定義全域性變數i

拓展:定義和宣告

(1)變數的定義:變數的定義用於為變數分配儲存空間,還可以為變數指定初始值。在一個程式中,變數有且僅有一個定義。

(2)變數的宣告:用於向程式表明變數的型別和名字。程式中變數可以宣告多次,但只能定義一次。

兩者聯絡與區別:

(1)定義也是宣告,因為當定義變數時我們也向程式表明了它的型別和名字;

(2)但宣告不是定義,可以通過使用extern關鍵字宣告變數而不定義它。不定義變數的宣告包括物件名、物件型別和物件型別前的關鍵字extern;

3.簡述static的用法

(1)在函式體,一個被宣告為靜態的變數在這一函式被呼叫過程中維持其值不變。

(2)在模組內(但在函式體外),一個被宣告為靜態的變數可以被模組內所用函式訪問,但不能被模組外其他函式訪問。它是一個本地的全域性變數。

(3)在模組內,一個被宣告為靜態的函式只可被這一模組內的其他函式呼叫。那就是,這個函式被限制在宣告它的模組的本地範圍內使用。

(4)類內的static成員變數屬於整個類所擁有,不能在類內進行定義,只能在類的作用域內進行定義。

(5)類內的static成員函式屬於整個類所擁有,不能呢個包含this指標,只能呼叫static成員函式

static全域性變數與普通的全域性變數有什麼區別:static全域性變數只初始化一次,防止在其他檔案單元中被引用。

static區域性變數和普通區域性變數有什麼區別:static區域性變數只被初始化一次,下一次依據上一次的結果值。

static函式與普通函式有什麼區別:static函式在記憶體中只有一份,普通函式在每次呼叫中維持一份拷貝。

static變數的儲存位置:

①static無論是全域性變數還是區域性變數都儲存在全域性/靜態區域,在編譯期就為其分配記憶體,在程式結束時釋放。

②const全域性變數儲存在只讀資料段,編譯期最初將其儲存在符號表中,第一次使用時為其分配記憶體,在程式結束時釋放。

③全域性變數儲存在全域性/靜態區域,在編譯期為其分配記憶體,在程式結束時釋放。

④區域性變數儲存在棧中,程式碼塊結束時釋放。

注:當全域性變數和靜態區域性變數未賦初值時,系統自動置為0。

4.new/delete是函式嗎?它們和malloc/free有何區別?
答:new/delete是C++中的運算子,malloc/free是C標準庫中提供的函式。他們都是用於動態申請記憶體和釋放記憶體的組合。它們的主要區別有: 
1.malloc/free是C/C++語言的標準庫函式,new/delete是C++的運算子 
2.new能夠自動分配空間大小 
3.對於使用者自定義的物件而言,用maloc/free無法滿足動態管理物件的要求。物件在建立的同時要自動執行建構函式,物件在消亡之前要自動執行解構函式。由於malloc/free是庫函式而不是運算子,不在編譯器控制權限之內,不能夠把執行建構函式和解構函式的任務強加於malloc/free。因此C++需要一個能對物件完成動態記憶體分配和初始化工作的運算子new,以及一個能對物件完成清理與釋放記憶體工作的運算子delete—簡而言之 new/delete能進行對物件進行構造和解構函式的呼叫進而對記憶體進行更加詳細的工作,而malloc/free不能。

5.const關鍵字有哪些用途,它和static有哪些區別?
答:對於const關鍵字,它主要是用來定義一個只讀變數。 const關鍵字至少有下列n個作用: 
(1)欲阻止一個變數被改變,可以使用const關鍵字。在定義該const變數時,通常需要對它進行初始化,因為以後就沒有機會再去改變它了; 
(2)對指標來說,可以指定指標本身為const,也可以指定指標所指的資料為const,或二者同時指定為const; 
(3)在一個函式宣告中,const可以修飾形參,表明它是一個輸入引數,在函式內部不能改變其值; 
(4)對於類的成員函式,若指定其為const型別,則表明其是一個常函式,不能修改類的成員變數; 
(5)對於類的成員函式,有時候必須指定其返回值為const型別,以使得其返回值不為“左值”。

6.explicit關鍵字的作用? 
關鍵字explicit只能作用於只有一個實參的建構函式(需要多個實參的建構函式不能用於執行隱式轉換,所以無須將這些建構函式指定為explicit的)。只能在類內宣告建構函式時使用explicit關鍵字,在類外部定義時不應重複。 
當使用explicit關鍵字宣告建構函式時,它將只能以直接初始化的形式使用。而且,編譯器將不會在自動轉換過程中使用該建構函式。