C/C++基礎知識總結
寫在前面:對於即將離開象牙塔的我們,需要面臨的一個首要問題就是如何在社會中佔據一席之地。在這裡,我想說是:機會總是留給有準備的人的!我不是在這裡空喊口號,而是以我過來人的經驗來告誡你們,任何的僥倖心理都不要有,只要你努力了、有準備了、足夠優秀了,工作的offer自然會飛到你手裡。
說明:本篇文章的參考書籍是——《C/C++程式員面試寶典》,我認為每一位找工作的同學,都可以去讀一讀,真心的很不錯。
《C/C++程式設計師面試寶典》PDF下載地址: ofollow,noindex">https://pan.baidu.com/s/1C76706fG0AzoVAVQ1YkGSw
C/C++基礎知識總結
1、C++中的基本資料型別有哪些?
答:3種類型:整數型、浮點型、void型。
2、整型有幾種形式,各種形式有什麼區別?
答:整型包括整數,字元和布林值的算術型別,根據修飾符細分為13種形式,其主要區別體現在型別名、長度、表示範圍幾個方面。
3、C++中有哪些常量?
答:6種常量:整型常量、浮點型常量、字元型常量、字串常量、轉義字元常量、地址常量。
4、常量與變數有哪些區別?
答:(1)常量的值不可改變,變數的值可以改變;(2)常量在定義時必須初始化,變數在定義可以不初始化;(3)常量不可以定址,其地址只可賦予常量指標,變數可以定址;(4)常量有較高的編譯執行效率;
5、操作符有哪些分類?
答:(1)按照運算元區分:一元操作符、二元操作符、三元操作符;(2)按照功能區分:算術操作符、關係操作符、邏輯操作符、位操作符、賦值操作符、自增自減操作符、箭頭操作符、條件操作符、sizeof操作符、逗號操作符。
6、自增自減前操作與後操作的區別?
答:前自增自減操作的優先順序大於賦值運算子(=),後自增自減操作的優先順序小於賦值運算子,後自增自減操作後表示式的值不會發生改變。
7、指標和變數的自增自減有什麼不同?
答:變數的自增自減是改變變數的值,指標的自增自減是改變指標的指向地址。
8、什麼是左值和右值?
答:變數是左值,可以在賦值語句的左邊;數字字面值是右值,不能被賦值。
9、變數有哪幾種初始化方式?
答:2種:直接初始化;複製初始化。直接初始化更加靈活而且執行效率更高。
10、變數的宣告和定義是什麼?
答:變數宣告的主要目的是表明變數的型別和名稱;變數定義的主要目的是分配儲存空間,它們有相同的時候。
11、C++中有哪幾種作用域?
答:3種:全域性作用域、區域性作用域、語句作用域。
12、變數有哪幾種儲存型別?
答:4種:自動型別、靜態型別、暫存器型別、外部型別。
13、C與C++有什麼區別?
答:C語言是結構化的程式語言,它是面向過程的,考慮的是實現過程;C++是面向物件的,考慮的是整個程式模型。
14、巨集定義與操作符的區別?
答:巨集定義是C++的預處理命令之一,它是一個替換操作,不做計算和表示式求解,不佔記憶體和編譯時間。
15、虛擬函式與純虛擬函式的特點?
答:虛擬函式必須是基類的非靜態成員函式,其訪問許可權可以是protected或public;純虛擬函式是虛擬函式的一個子集,含有純虛擬函式的類就是抽象類,它不能生成物件。
16、如何使用純虛擬函式?
答:純虛擬函式用來定義沒有意義的實現,用於抽象類中需要交給派生類具體實現的方法。
17、什麼是指標?
答:指標是用來儲存記憶體地址的變數,它指向單個物件的地址,除了void指標型別外,指標的資料型別與所指向地址的變數的資料型別需要保持一致。
18、const物件的指標和const指標的區別?
答:const指標本身的值不可改變,但可以使用該指標修改它所指物件的值;const變數的指標不可以修改所指向的const變數的值,但指標本身可以被重新賦值。
19、陣列指標與指標陣列的區別?
答:陣列指標是一個指標變數,它指向一個數組;指標陣列是一個只包含指標元素的陣列,它的元素可以指向相同型別的不同物件。
20、什麼是函式指標?
答:函式指標就是指向函式的儲存空間地址的指標,可以對函式指標進行賦值並通過函式指標來呼叫函式。
21、引用與值傳遞的區別?
答:值傳遞傳遞的是一個值的副本,函式對形參的操作不會影響實參的值;引用傳遞傳遞的是引用物件的記憶體地址,函式對形參的操作會影響實參的值,實參的值會隨著形參的值得改變而改變。
22、指標與引用的區別?
答:(1)引用無需解引用,指標需要解引用;(2)引用在定義時被初始化一次,之後不可變,指標可變;(3)引用不能為空,指標可以為空;(4)程式為指標變數分配記憶體區域,而引用不需要分配記憶體區域,所以指標自增操作是指標變數的自增,引用自增操作是變數值的自增。
23、面向物件與面向過程的區別?
答:面向過程是一種以過程為中心的程式設計思想,以演算法進行驅動;面向物件是一種以物件為中心的程式設計思想,以訊息進行驅動。面向過程程式語言的組成:程式=演算法+資料;面向物件程式語言的組成:程式=物件+訊息。
24、面向物件的特徵是什麼?
答:面對物件的3個要素:封裝,繼承,多型。面向物件中所有物件都可以歸屬為一個類。
25、類與結構體有什麼區別?
答:(1)結構體儲存在棧中,類的例項化可以儲存在棧中,也可以儲存在堆中;(2)結構體的執行效率比類要高;(3)結構體沒有解構函式,類有解構函式;(4)結構體不可以繼承,類可以繼承。
26、如何訪問靜態成員?
答:靜態成員可以通過類名直接呼叫,不需要建立類的例項,也可以通過類的例項進行呼叫,但底層仍然是通過類名呼叫的,所以不推薦這種呼叫方法。類的靜態方法只能訪問類的靜態成員。
27、什麼是多型?
答:多型就是將子類物件賦給父類變數,父類變數在編譯期和執行期表現出不同的特性。
28、在C++中如何實現多型?
答:多型有動態多型、靜態多型、函式多型和巨集多型等,我們常說的多型指的是動態多型,它是基於繼承機制和虛擬函式來實現的。
29、派生類與基類的轉換?
答:派生類總是可以轉換為基類的引用型別;基類轉換為派生類需要在確定安全的情況下使用強制轉換來實現。
30、什麼是虛成員,有什麼作用?
答:虛擬函式的作用是實現動態聯編,程式發現虛擬函式名前的關鍵字virtual後,會自動將其作為動態聯編處理,即在程式執行時動態的選擇合適的成員函式。
31、C++覆蓋與隱藏概述?
答:(1)覆蓋指的是在子類和父類中,存在函式名、引數均相同的函式,並且父類的該函式為虛擬函式;(2)隱藏指的是在子類與父類中,存在函式名相同、引數不同的函式,此時無論父類函式是否為虛擬函式,父類函式都會被被隱藏,或者存在函式名、引數均相同的函式,此時只有當父類函式不為虛擬函式時,父類函式才會被隱藏。
32、什麼是深拷貝與淺拷貝?
答:如果一個類擁有資源,當這個類的資源發生複製過程時,就叫做深拷貝;如果物件存在資源但在複製過程中並未複製資源就是淺拷貝。
33、什麼是拷貝建構函式,什麼時候呼叫?
答:拷貝建構函式由編譯器呼叫來完成一些基於同一類的其他物件的構建及初始化。有3種情況會使用拷貝建構函式:(1)一個物件以值傳遞的方式傳入函式體;(2)一個物件以值傳遞的方式從函式返回;(3)一個物件需要通過另外一個物件進行初始化。
34、什麼是型別轉換建構函式?
答:一個類的建構函式只有一個引數,該引數型別不為該類型別而是其他型別, 這個建構函式就被稱為型別轉換建構函式,它可以用來處理不同域的同一資料值。
35、C++支援引數個數不確定的函式嗎?
答:C++可以通過隱藏引數機制支援引數不確定的函式。
36、什麼是行內函數?
答:在類宣告的內部宣告或定義的成員函式叫做內聯(inline)函式,在行內函數內不允許有迴圈語句和switch語句。
37、引用形參與非引用形參的區別?
答:引用形參是將引數變數的地址來進行傳遞,可以通過函式對形參的呼叫來修改實參的值。
38、使用引用形參有什麼問題?
答:呼叫非const型別的引用形參,實參必須不是const型別,二者型別應當一致;當呼叫一個有const引用的形參函式時,如果實參不是一個變數或者型別不匹配時,函式會建立一個無名的臨時變數用來儲存實參的值,並把這個形參作為該臨時變數的引用。
39、指標形參和引用形參有什麼區別?
答:指標形參是指函式的引數是指標,它不會像引用形參那樣通過函式呼叫影響實參的值,但是呼叫後它會修改實參的物件。程式中建議儘量少使用指標形參,這樣會使程式的可讀性下降。
40、什麼是靜態函式?如何使用靜態函式?
答:靜態函式是用static修飾符修飾的函式,靜態函式沒有this指標,只能訪問靜態變數。類中如果函式呼叫的結果不會訪問或者修改任何物件資料成員,這樣的成員宣告為靜態成員函式比較好。
41、函式過載及作用域?
答:函式過載是指在相同作用域下,具有相同名稱而不同引數列表的多個函式。
42、函式過載時如何實現實參的型別轉換?
答:在函式過載匹配時,先通過標準轉換來實現匹配,如果不行,再通過類型別轉換來實現匹配。
43、什麼是函式模板?
答:函式模板技術是指使用了模板技術定義了引數化型別的非成員函式,這使得程式能夠使用不同的引數型別呼叫相同的函式。
44、什麼是類模板?
答:類模板是使用模板技術的類,描述了能夠管理其他資料型別的通用資料型別。類模板技術通常用於建立包含其他型別的容器類(佇列、連結串列、堆疊等)。
45、什麼是泛型程式設計?
答:泛型程式設計就是以獨立於特定類實現的方式編寫程式碼,針對不同的型別提供通用的實現。
46、C++如何實現泛型程式設計?
答:C++中泛型程式設計的實現是使用C++中的模板技術來實現的,主要是設計函式模板和類模板。
後記:歡迎各路大神批評與指正!