1. 程式人生 > >c/c++常見面試題

c/c++常見面試題

1. C中static有什麼作用

(1)隱藏。 當我們同時編譯多個檔案時,所有未加static字首的全域性變數和函式都具有全域性可見性,故使用static在不同的檔案中定義同名函式和同名變數,而不必擔心命名衝突。
(2)static的第二個作用是保持變數內容的持久。儲存在靜態資料區的變數會在程式剛開始執行時就完成初始化,也是唯一的一次初始化。共有兩種變數儲存在靜態儲存區:全域性變數和static變數。
(3)static的第三個作用是預設初始化為0。其實全域性變數也具備這一屬性,因為全域性變數也儲存在靜態資料區。在靜態資料區,記憶體中所有的位元組預設值都是0×00,某些時候這一特點可以減少程式設計師的工作量。


2.C++中const有什麼用?

不要一聽到const就說是常量,這樣給考官一種在和一個外行交談的感覺。應該說const修飾的內容不可改變就行了, 定義常量只是一種使用方式而已,還有const資料成員,const引數, const返回值, const成員函式等, 被const修飾的東西都受到強制保護,可以預防意外的變動,能提高程式的健壯性。

3. C與C++各自是如何定義常量的?有什麼不同?

C中是使用巨集#define定義, C++使用更好的const來定義。
區別:

1)const是有資料型別的常量,而巨集常量沒有,編譯器可以對前者進行靜態型別安全檢查,對後者僅是字元替換,沒有型別安全檢查,而且在字元替換時可能會產生意料不到的錯誤(邊際效應)。

2)有些編譯器可以對const常量進行除錯, 不能對巨集除錯。


4. 既然C++中有更好的const為什麼還要使用巨集?

const無法代替巨集作為衛哨來防止檔案的重複包含。


5. C++中引用和指標的區別?

引用是物件的別名, 操作引用就是操作這個物件, 必須在建立的同時有效得初始化(引用一個有效的物件, 不可為NULL), 初始化完畢就再也不可改變, 引用具有指標的效率, 又具有變數使用的方便性和直觀性, 在語言層面上引用和物件的用法一樣, 在二進位制層面上引用一般都是通過指標來實現的, 只是編譯器幫我們完成了轉換. 之所以使用引用是為了用適當的工具做恰如其分的事, 體現了最小特權原則.


6. 說一說C與C++的記憶體分配方式?

1)從靜態儲存區域分配。記憶體在程式編譯的時候就已經分配好,這塊記憶體在程式的整個執行期間都存在,如全域性變數,static變數。

2)在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器的指令集中,效率很高,但是分配的記憶體容量有限。

3)從堆上分配(動態記憶體分配)程式在執行的時候用malloc或new申請任意多少的記憶體,程式設計師負責在何時用free或delete釋放記憶體。動態記憶體的生存期自己決定,使用非常靈活。


7. new/delete 與 malloc()/free() 的區別?

malloc() 與 free() 是C語言的標準庫函式, new/delete 是C++的運算子, 他們都可以用來申請和釋放記憶體, malloc()和free()不在編譯器控制權限之內, 不能把建構函式和解構函式的任務強加給他們.


8. #include<a.h>和#include“a.h” 有什麼區別?

答:對於#include <a.h> ,編譯器從標準庫路徑開始搜尋 a.h對於#include “a.h” ,編譯器從使用者的工作路徑開始搜尋 a.h


9. 在C++ 程式中呼叫被 C編譯器編譯後的函式,為什麼要加 extern “C”?

C++語言支援函式過載,C語言不支援函式過載。函式被C++編譯後在庫中的名字與C語言的不同。假設某個函式的原型為: void foo(int x, int y);該函式被C編譯器編譯後在庫中的名字為_foo,而C++編譯器則會產生像_foo_int_int之類的名字。C++提供了C連線交換指定符號extern“C”來解決名字匹配問題。


10. C++中的什麼是多型性? 是如何實現的?

多型性是面向物件程式設計語言繼資料抽象和繼承之後的第三個基本特徵。它是在執行時出現的多型性通過派生類和虛擬函式實現。基類和派生類中使用同樣的函式名, 完成不同的操作具體實現相隔離的另一類介面,即把“ w h a t”從“h o w”分離開來。多型性提高了程式碼的組織性和可讀性,虛擬函式則根據型別的不同來進行不同的隔離。

11. 什麼是動態特性?

在絕大多數情況下, 程式的功能是在編譯的時候就確定下來的, 我們稱之為靜態特性. 反之, 如果程式的功能是在執行時刻才能確定下來的, 則稱之為動態特性。C++中, 虛擬函式,抽象基類, 動態繫結和多型構成了出色的動態特性。


12.什麼是封裝?C++中是如何實現的?

封裝來源於資訊隱藏的設計理念, 是通過特性和行為的組合來建立新資料型別讓介面與具體實現相隔離。C++中是通過類來實現的, 為了儘量避免某個模組的行為干擾同一系統中的其它模組,應該讓模組僅僅公開必須讓外界知道的介面. http://hovertree.com/menu/cpp/


13. 什麼是RTTI?

RTTI事指執行時型別識別(Run-time type identification)在只有一個指向基類的指標或引用時確定一個物件的準確型別。


14. 什麼是拷貝建構函式?

它是單個引數的建構函式,其引數是與它同屬一類的物件的(常)引用;類定義中,如果未提供自己的拷貝建構函式,C++提供一個預設拷貝建構函式,該預設拷貝建構函式完成一個成員到一個成員的拷貝


15. 什麼是深淺拷貝?

淺拷貝是建立了一個物件用一個現成的物件初始化它的時候只是複製了成員(簡單賦值)而沒有拷貝分配給成員的資源(如給其指標變數成員分配了動態記憶體); 深拷貝是當一個物件建立時,如果分配了資源,就需要定義自己的拷貝建構函式,使之不但拷貝成員也拷貝分配給它的資源.http://hovertree.com/menu/c/


16.面向物件程式設計的優點?

開發時間短, 效率高, 可靠性高。面向物件程式設計的編碼具有高可重用性,可以在應用程式中大量採用成熟的類庫(如STL),從而雖短了開發時間,軟體易於維護和升級。

相關推薦

C語言見面試題

面試題>>C 語言 1.請寫出 : bool, float, *p 與零值比較的 if 語句 bool flag : if(flag) if(!flag) float x : const float EXP = 0.0000001 ;if((x >= -EXP

c++STL見面試題2

1.C++ STL 之所以得到廣泛的讚譽,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封裝了許多複雜的資料結構演算法和大量常用資料結構操作。vector封裝陣列,list封裝了連結串列,map和set封裝了二叉樹等 2

C++STL見面試題

1.C++ STL 之所以得到廣泛的讚譽,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封裝了許多複雜的資料結構演算法和大量常用資料結構操作。vector封裝陣列,list封裝了連結串列,map和set封裝了二叉樹等

C語言見面試題(經典中的經典)

1. 輸入一串字元,計算其中空格的個數。  #include <stdio.h> #include <string.h> int function(char *str); int main() {        char str[30];      

C++關於鏈表的幾個見面試題

ext int 偏移 倒數 list tail 創建 null lse 1、從尾到頭打印鏈表 2、刪除鏈表節點 3、鏈表中倒數第K個節點 4、反轉鏈表 5、合並兩個排序的鏈表 6、兩個鏈表的第一個公共節點 最基本的先上,往鏈表的末尾添加節點: ListNode *AddTo

C語言_二叉樹的基本操作及見面試題

本片部落格主要包含以下內容: 和二叉樹操作相關的佇列基本操作 初始化 入佇列 判斷佇列是否為空 出佇列,返回對頭元素 和二叉樹相關的棧的基本操作 初始化 入棧 出棧 判空 返回棧頂元素並出棧 返回棧頂元素不出棧

C++見面試題

第一篇 1、在函式內定義一個字元陣列,用gets函式輸入字串的時候,如果輸入越界,為什麼程式會崩潰? 答:因為gets無法截斷陣列越界部分,會將所有輸入都寫入記憶體,這樣越界部分就可能覆蓋其他內容,造成程式崩潰。 2、C++中引用與指標的區別 答:聯絡:引

連結串列見面試題-C語言實現

前面的部落格已經介紹過了實現連結串列的一些相關的功能,所以在這裡就不對連結串列多加解釋說明了。 對於連結串列相關面試題這裡解釋幾個有特點的題: 1.對於求查詢連結串列的中間結點,要求只能遍歷一次連結串列? 方式:使用兩個指標,一個快指標,一個慢指標,快指標走兩步慢指標走一步

c/c++見面試題

1. C中static有什麼作用 (1)隱藏。 當我們同時編譯多個檔案時,所有未加static字首的全域性變數和函式都具有全域性可見性,故使用static在不同的檔案中定義同名函式和同名變數,而不必擔心命名衝突。(2)static的第二個作用是保持變數內容的持久。儲存在靜態資料區的變數會在程式剛開始執行時就

c++見面試題30道

1.new、delete、malloc、free關係 delete會呼叫物件的解構函式,和new對應free只會釋放記憶體,new呼叫建構函式。malloc與free是C++/C語言的標準庫函式,new/delete是C++的運算子。它們都可用於申請動態記憶體和釋放記憶

C++見面試題(三)-static總結

1、不考慮類 1)隱藏 當同時編譯多個檔案時,所有未加static字首的全域性變數和函式都具有全域性可見性。例如,同時編譯兩個原始檔a.cpp和main.cpp。如果,在一個檔案中的變數或函式加了static就會對其他檔案不可見。 2)預設初始化為0 包括未初始化的全域性靜

c++見面試題-C/C++程式記憶體分配情況

1.由C/C++編譯的程式佔用的記憶體分為以下幾個部分 1、棧區(stack)—   由編譯器自動分配釋放 ,存放為執行函式而分配的區域性變數、函式引數、返回資料、返回地址等。其操作方式類似於資料結構中的棧。 2、堆區(heap) —   一般由程式設計師分配釋放, 若程式

C/C++程式設計師見面試題

1. 結構體和共同體的區別。 定義: 結構體struct:把不同型別的資料組合成一個整體,自定義型別。 共同體union:使幾個不同型別的變數共同佔用一段記憶體。 地址: struct和union都有記憶體對齊,結構體的記憶體佈局依賴於CPU、作業系統、編譯器及編譯時的對齊選項。 關於記憶體對齊,先讓我

見面試題之數組

-- 子數組 一次 寶典 和為s的兩個數字 n) class 時間 整數 參考文獻: 1.《編程之美》 2.《劍指offer》 3.《王道程序猿求職寶典》 常見題例如以下: 1.二維數組中查找某個數。該數組滿足:左->右:遞增,上->下:遞增。-------

第十二章 Shell腳本編寫及見面試題(二)

shell腳本 shell面試題 shell本章目錄:12.11 屏蔽網站訪問頻繁的IP1)屏蔽每分鐘訪問超過200的IP方法1:以Nginx日誌作為測試DATE=$(date +%d/%b/%Y:%H:%M) ABNORMAL_IP=$(tail -n5000 access.log |grep $DATE

java見面試題——java常見筆試題

外部類 成員變量 exceptio rect creat 依次 chan 發的 簡單工廠模式 註:轉載自http://www.cnblogs.com/yhason/archive/2012/05/08/2489932.html,版權歸其所有! 5、String是最基本的數

java見面試題——java筆試題總結

title bean hash strong 程序 面試題 瓶頸 factor 集合 註:本文轉載自http://www.cnblogs.com/huajiezh/p/5790928.html,版權歸其所有! Java常見面試題總結 一、Java基礎 1、String

Android 見面試題

actor iap timer key 簡單 mar star ray 緩存 這些面試是我之前總結的 。覺得還不錯,就貼出來與大家分享一下。當中有不少問題。也是我以前被面試官問過的問題,另一些基礎問題總結(既然是基礎知識 ,必定是成為一名的 Androi

Java見面試題之Forward和Redirect的區別

http請求 請求重定向 兩種 原理 目的 方式 重定向 public javax 原文出處: 阿赫瓦裏 Forward和Redirect代表了兩種請求轉發方式:直接轉發和間接轉發。 直接轉發方式(Forward),客戶端和瀏覽器只發出一次請求,Servlet、HTML

php見面試題(2)

文字 select lec 面試題 subst 分析 mat 例如 %d 1、session與cookie的區別   1、cookie數據存放在客戶的瀏覽器上,session數據放在服務器上。   2、cookie不是很安全,別人可以分析存放在本地的COOKIE並進行COO