c++面試知識總結


1、對於一個頻繁使用的短小函數,在c語言中應用什么實現,在c++中應用什么實現

  答:c:宏定義;c++:inline內聯函數

 

2、全局變量和局部變量的區別?

  答:

    1、生命周期不同:

      全局變量:隨主程序創建而創建,隨主程序結束而銷毀。

      局部變量:函數或者{}括號內部,退出或執行完就銷毀

    2、作用域不同:

      全局變量:源文件內所有函數都可以使用

      局部變量:函數內部或者{}括號內部有效,只能局部使用

    3、內存分配不同:

      全局變量:全局數據段並且在程序運行的時候加載

      局部變量:分配在堆棧里

 

3、在申請內存找不大足夠大的內存塊,malloc和new將返回NULL指針,內存申請失敗,怎么處理內存耗盡?

  答:直接return

 

4、如何判斷一個操作系統是16位還是32位系統

  答:

    1、使用變量指針*p,sizeof(p) == 2 為16位,==4 為32位

    2、unsigned int a = ~0; if( a > 65536 ) 為32位,否則 16位

 

5、為什么數組名做參數會改變數組內容?

  答:數組名就是數組的首地址

 

6、析構函數和虛函數的用法和作用?

  答:

    析構函數:是c++特殊的類成員函數,沒返回值、沒參數、不能調用。在類對象執行完畢,作用是銷毀並釋放內存。

    虛函數:是c++多態的一種表現,使用虛函數可以動態綁定,當然也會以系統開銷為代價的

 

7、引用和指針有什么區別?

  答:

    引用:必須初始化;初始化后不能改變;不存在指向空值

    指針:不必初始化;指針可以改變所指對象;指針可以指向空值

 

8、虛函數只能借助引用或者指針來達到多態的效果。

 

9、在c++中能否有虛構造函數?

  答:不能,只能有虛析構函數。

 

10、重載、重寫、重定義的區別?

  答:

    重載:類對象的同名不同參函數

    重寫:子類繼承父類的函數

    重定義:子類繼承父類的虛函數

 

11、i++和++i的效率比較

  答:

    -》內建數據類型的情況,效率一樣

    -》自定義數據類型的情況,++i效率高

 

12、理解內聯函數和宏的區別

  答:

    -》內聯函數在編譯時展開,宏在預編譯時展開

    -》在編譯的時候,內聯函數可以直接嵌套到目標代碼中,宏只是一個簡單的文本替換

    -》內聯函數可以完成類型檢測、語句檢查等功能,宏不具有這樣的功能

 

13、引用和指針易錯點:

  -》int &c:引用類型的變量必須初始化。

  -》int &d = 2,&d = c:引用類型只能初始化的時候賦值

  -》int *p; *p = 5:*p是野指針,直接賦值很危險

 

14、類的靜態成員和靜態函數:

  -》靜態成員 不能在內部初始化,只能在類定義外面初始化

  -》靜態函數,在類外使用,因它不含this指針,所以不能調用類內的非靜態成員

 

15、explicit構造函數:作用是防止隱式轉換

 

16、賦值構造函數與復制構造函數的區別

    賦值構造函數:引用指針對象

      格式: A& operator = (const A& other)

      clas A;

      A a;

      A b;

      b = a;// 賦值調用

    復制構造函數:復制指針對象;以參數傳進來的對象初始化產生一個對象

      格式:A(const A& other):m_i(other.m_i)

      A a;

      A b = a;//復制構造函數調用

 

17、臨時對象在什么情況下產山(會影響程序的執行效率)

  -》參數按值傳遞

    void fun1( Test test);

  -》返回值按值傳遞

    void fun1( ){

      Test t(2);

      teturn t;

    }

 

  解決辦法:改成對象引用傳入

    void fun1( Test &test);

 

18、內存申請,使用之前檢查

  -》函數參數:

    assert( p != NULL);

  -》malloc或者new 

    if( p != NULL )

   釋放了內存卻繼續使用它。 
  有三種情況:
  (1)程序中的對象調用關系過於復雜,實在難以搞清楚某個對象究竟是否已經釋放了內存,此時應該重新設計數據結構,從根本上解決對象管理的混亂局面。
  (2)函數的return語句寫錯了,注意不要返回指向“棧內存”的“指針”或者“引用”,因為該內存在函數體結束時被自動銷毀。
  (3)使用free或delete釋放了內存后,沒有將指針設置為null。導致產生“野指針”。
  【規則1】用malloc或new申請內存之后,應該立即檢查指針值是否為null。防止使用指針值為null的內存。
  【規則2】不要忘記為數組和動態內存賦初值。防止將未被初始化的內存作為右值使用。
  【規則3】避免數組或指針的下標越界,特別要當心發生“多1”或者“少1”操作。
  【規則4】動態內存的申請與釋放必須配對,防止內存泄漏。

  【規則5】用free或delete釋放了內存之后,立即將指針設置為null,防止產生“野指針”。

  

  

 

    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM