本文主要是簡單的總結了一下找工作的過程中,需要瞭解的一些C/C++的基礎知識點。 ...
寫在前面:對於即將離開象牙塔的我們,需要面臨的一個首要問題就是如何在社會中占據一席之地。在這裡,我想說是:機會總是留給有準備的人的!我不是在這裡空喊口號,而是以我過來人的經驗來告誡你們,任何的僥幸心理都不要有,只要你努力了、有準備了、足夠優秀了,工作的offer自然會飛到你手裡。
說明:本篇文章的參考書籍是——《C/C++程式員面試寶典》,我認為每一位找工作的同學,都可以去讀一讀,真心的很不錯。
《C/C++程式員面試寶典》PDF下載地址: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++中的模板技術來實現的,主要是設計函數模板和類模板。
後記:歡迎各路大神批評與指正!