本文是摘錄了網上的一些C++的面試題, 發現自己不能馬上反應過來,或者還有點迷惘的,對自己的基礎表示哭泣。希望大家都能知道。
請講述堆和棧的區別。
(1)申請方式不同。棧上有系統自動分配和釋放( 局部變量 );堆上有程序員自己申請並指明大小(new/malloc);
(2)棧是向低地址擴展的數據結構,大小很有限;堆是向高地址擴展,是不連續的內存區域,空間相對大且靈活;
(3)棧由系統分配和釋放速度快;堆由程序員控制,一般較慢,且容易產生碎片(不釋放,會造成內存泄漏);static數據成員和static成員函數
(1)static數據成員:
static數據成員獨立於該類的任意對象而存在;每個static數據成員是與類關聯的對象,並不與該類的對象相關聯。Static數據成員(const static數據成員除外)必須在類定義體的外部定義。不像普通數據成員,static成員不是通過類的構造函數進行初始化,而是應該在定義時進行初始化。除了 const int 型的static成員便可以在類定義體內部進行初始化。記住一定只能是const int型的,換成const string ,double都不行的
(2)static成員函數:
static成員函數沒有this形參,它可以直接訪問所屬類的static成員,不能直接使用非static成員。因爲static成員不是任何對象的組成部分,所以static成員函數不能被聲明爲const。同時,static成員函數也不能被聲明爲虛函數。多態類中的虛函數表是 Compile-Time,還是 Run-Time時建立的?
虛擬函數表是在編譯期就建立了,各個虛擬函數這時被組織成了一個虛擬函數的入口地址的數組。而對象的隱藏成員–虛擬函數表指針是在運行期–也就是構造函數被調用時進行初始化的,這是實現多態的關鍵。以下三條輸出語句分別輸出什麼?
char str1[] = “abc”;
char str2[] = “abc”;
const char str3[] = “abc小羅”;
const char str4[] = “abc”;
const char* str5 = “abc”;
const char* str6 = “abc”;
cout << boolalpha << ( str1==str2 ) << endl; //輸出什麼?
cout << boolalpha << ( str3==str4 ) << endl; //輸出什麼?
cout << boolalpha << ( str5==str6 ) << endl; //輸出什麼?分別輸出 false,false,true。str1和str2都是字符數組,每個都有其自己的存儲區,它們的值則是各存儲區首地址,不等;str3和str4同上,只是按const語義,它們所指向的數據區不能修改。str5和str6並非數組而是字符指針,並不分配存儲區,其後的“abc”以常量形 式存於靜態數據區,而它們自己僅是指向該區首地址的指針。
在什麼時候需要使用“常引用”?
如果既要利用引用提高程序的效率,又要保護傳遞給函數的數據不在函數中被改變,就應使用常引用。string foo( );
void bar(string & s);那麼下面的表達式將是非法的:
bar(foo( ));
bar(“hello world”);原因在於foo( )和”hello world”串都會產生一個臨時對象,而在C++中,這些臨時對象都是const類型的。因此上面的表達式就是試圖將一個const類型的對象轉換爲非const類型,這是非法的。
引用型參數應該在能被定義爲const的情況下,儘量定義爲const。
改成: void bar(const string &str)就兩個都正確“#include 《file.h》 與 #include “file.h”的區別”? 《 = <
前者是從標準庫路徑尋找和引用file.h,而後者是從當前工作路徑搜尋並引用file.h。簡述數組與指針的區別?
數組要麼在靜態存儲區被創建(如全局數組),要麼在棧上被創建。指針可以隨時指向任意類型的內存塊。
(1)修改內容上的差別
char a[] = “hello”;
a[0] = ‘X’;
char *p = “world”; //注意p指向常量字符串
printf(“%c”, p[0]); //輸出W
printf(“%s”, p[0]); //編譯器不能發現該錯誤 運行時錯誤
p[0] = ‘X’; //編譯器不能發現該錯誤,運行時錯誤。(VS2015)(2)用運算符sizeof可以計算出數組的容量(字節數)。sizeof(p),p爲指針得到的是一個指針變量的字節數,而不是p所指的內存容量。
以後發現其他的補上,如有不對,請告知。
啦啦啦啦啦