(轉) 關於C++面試中一點小問題

本文是摘錄了網上的一些C++的面試題, 發現自己不能馬上反應過來,或者還有點迷惘的,對自己的基礎表示哭泣。希望大家都能知道。

  1. 請講述堆和棧的區別。
    (1)申請方式不同。棧上有系統自動分配和釋放( 局部變量 );堆上有程序員自己申請並指明大小(new/malloc);
    (2)棧是向低地址擴展的數據結構,大小很有限;堆是向高地址擴展,是不連續的內存區域,空間相對大且靈活;
    (3)棧由系統分配和釋放速度快;堆由程序員控制,一般較慢,且容易產生碎片(不釋放,會造成內存泄漏);

  2. 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成員函數也不能被聲明爲虛函數。

  3. 多態類中的虛函數表是 Compile-Time,還是 Run-Time時建立的?
    虛擬函數表是在編譯期就建立了,各個虛擬函數這時被組織成了一個虛擬函數的入口地址的數組。而對象的隱藏成員–虛擬函數表指針是在運行期–也就是構造函數被調用時進行初始化的,這是實現多態的關鍵。

  4. 以下三條輸出語句分別輸出什麼?

    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”以常量形 式存於靜態數據區,而它們自己僅是指向該區首地址的指針。

  5. 在什麼時候需要使用“常引用”?
    如果既要利用引用提高程序的效率,又要保護傳遞給函數的數據不在函數中被改變,就應使用常引用。

    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)就兩個都正確

  6. “#include 《file.h》 與 #include “file.h”的區別”? 《 = <
    前者是從標準庫路徑尋找和引用file.h,而後者是從當前工作路徑搜尋並引用file.h。

  7. 簡述數組與指針的區別?

    數組要麼在靜態存儲區被創建(如全局數組),要麼在棧上被創建。指針可以隨時指向任意類型的內存塊。

    (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所指的內存容量。

以後發現其他的補上,如有不對,請告知。

啦啦啦啦啦

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