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.結構體可以直接賦值嗎

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

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,再自增1

10.volatile有什麼作用

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


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