C++一些常見面試題---持續更新

1.變量的聲明何定義有什麼區別

變量的定義爲變量分配地址和存儲空間,變量的聲明不分配地址。一個變量能夠在多個地方聲明,可是隻在一個地方定義。同時加入extern修飾的變量的聲明,說明此變量將在文件之外或在文件後面部分定義。
說明-不少時候一個變量,只是聲明不分配內存空間,直到具體使用時才初始化,分配內存空間,如外部變量。編程

int main()
{
extern int A;
//這是個聲明而不是定義,聲明A是一個已經定義了的外部變量
//注意:聲明外部變量時能夠把變量類型去掉如:extern A;
dosth(); //執行函數
}
int A; //是定義,定義了A爲整型的外部變量

2.簡述#ifdef、#else、#endif和ifndef的做用

在程序中能夠利用#ifdef、#endif將某一個模塊的代碼特殊定義,以向特定用戶提供該功能。在不須要用戶能夠將其屏蔽。數組

#ifdef MATH
#include "math.c"
#endif

同時在window下應對硬件編譯的時候,能夠利用這種編譯繞過硬件,直接進行編譯得出預期的結果。
注意-雖然不用條件編譯命令而直接用if語句也能達到要求,但那樣作目標程序長,運行時間長,進行條件編譯時,能夠減小被編譯的語句,從而減小目標程序的長度,減小運行時間。多線程

3.寫出int、bool、float、指針變量與"零值"比較的if語句

//int與零值比較
if ( n == 0 )
if ( n != 0 )
//bool與零值比較
if (flag) // 表示flag爲真
if (!flag) // 表示flag爲假
//float與零值比較
const float EPSINON = 0.00001;
if ((x >= - EPSINON) && (x <= EPSINON) //其中EPSINON是容許的偏差(即精度)。
//指針變量與零值比較
if (p == NULL)
if (p != NULL)

4.結構體能夠直接賦值嗎

聲明時能夠直接初始化,同一結構體的不一樣對象之間也能夠直接賦值,可是當結構體中含有指針"成員"時必定要當心。
注意-當有多個指針指向同一段內存時,某個指針釋放這段內存可能會致使其餘指針的非法操做。所以在釋放前必定要確保其餘指針再也不使用這段內存空間ide

5.sizeof與strlen的區別

sizeof是一個操做符,strlen是庫函數
sizeof的參數能夠是數據的類型,也能夠是變量。而strlen只能以結尾'\0'的字符串作參數
編譯器在編譯時就計算出了sizeof的結果,而strlen函數必須在運行時才能計算出來,而且sizeof計算的數據類型佔內存的大小,而strlen計算的是字符串實際的長度
數組作sizeof的參數不退化,傳遞給strlen就退化爲指針了函數

6.c語言的關鍵字static和C++的關鍵字static有什麼區別

在c中,static關鍵字用來修飾局部靜態變量和外部靜態變量、函數。在C++中除了上述功能外,還用來定義類的成員變量和函數。即靜態成員和靜態成員函數
注意-在編程時static的記憶性,和全局性的特色可讓在不一樣時期調用的函數進行通訊,傳遞信息,而C++的靜態成員則能夠在多個對象實例間進行通訊,傳遞信息線程

7.c語言的Malloc和C++中new delete的區別

new、delete是操做符,能夠進行重載,只能在C++中使用
malloc、free是函數,能夠覆蓋,c與C++中均可以使用
new能夠調用對象的構造函數,相應delete調用的是析構函數
malloc僅僅分配內存,free僅僅回收內存,並不執行構造與析構函數
new、delete返回的是某種數據類型指針,malloc、free返回的是void指針
注意-malloc申請的內存空間要用free釋放,而new申請的內存空間要用delete釋放,不要混用指針

8.寫一個"標準"宏MIN

# d e f i n e m i n ( a , b ) ( ( a ) < = ( b ) ? ( a ) : ( b ) )

9.++i和i++的區別

++i自增1再返回
i++先返回1,再自增1code

10.volatile有什麼做用

狀態寄存器一類的並行設備硬件寄存器
一箇中斷服務子程序會訪問到的非自動變量
多線程間被幾個任務共享的變量
注意-雖然volatile在嵌入式方面應用比較多,可是在PC端軟件的多線程中,volatile修飾的臨界變量也是很是實用的對象

相關文章
相關標籤/搜索