1.c和c++中struct有什麼區別?
①.c中沒有保護權限,不能定義函數,但能夠有函數指針。
②.c++中有保護權限默認是private,能夠定義函數。
2.c++中的struct和class有什麼區別?
①.繼承權限不一樣:struct 按照public權限繼承而class按照private權限繼承。
②.成員的默認訪問權限不一樣:class的成員默認是private權限,struct的成員默認是public。
3.引用和指針有什麼區別?
①.經過指針變量操做指針指向的目標屬於間接操做。
②.引用自己就是目標變量的別名,對引用的操做就是操做目標自己。
③.引用在定義時必須初始化,並且綁定對象後不能更改。指針則沒必要。
④.不存在空的引用。但能夠存在指向空值的指針。
4.c++中值得傳遞方式有幾種?
①.值傳遞
②.地址傳遞
③.引用傳遞
5.什麼是內聯函數,應用什麼實現?
①.內聯函數(就是對於一個頻繁使用的短小函數)用關鍵字inline(內聯函數要作參數類型檢查)
②.c中使用宏定義(宏是原樣替換,不作類型檢查),
③.宏定義和內聯函數存在本質的區別,轉換的時候應考慮是否轉換後功能是否正常。
6.c++中virtual 與inline的含義分別是什麼?
①.virtual 關鍵字,類成員函數聲明前加virtual關鍵字修飾,則該成員函數爲虛函數。
②.inline 關鍵字,在函數定義前加inline修飾,則該函數爲內聯函數。
note:inline 是一種用於實現的關鍵字,而不是用於聲明的關鍵字。
7.函數assert的用法?
①.assert爲斷言。僅在Debug版本起做用,用於檢查不應發生的狀況。
當值爲假時,現向stderr打印一條出錯信息。而後調用abort終止程序。
8.const 與 #define比較,有什麼優勢?
①.宏常量沒有數據類型而const有數據類型,編譯器可對其進行類型安全檢查。
②.有些調試工具能夠對const常量調試,而不能對宏常量調試。
9.malloc/free 與 new/delete的區別?
①.malloc/free是c++標準庫函數,new/delete是c++的運算符。兩者均可以動態申請內存和釋放內存
②.malloc/free沒法知足動態對象的要求,即構造函數與析構函數的自動執行。因此出現了new/delete
note:new/delete 不是庫函數。
10.c++是否是類型安全的?
①.不是,不一樣類型能夠進行強制轉換。
11.c++中const關鍵字?
①.const修飾變量: 該變量爲只讀變量,const變量必須初始化。
②.const修飾指針:
1)修飾指針指向的變量:指針指向的變量爲只讀變量,不能經過指針修改變量的值,但能夠改變指針的指向。
eg: const int *p;
2)修飾指針自己:即該指針爲常量型指針,不能修改其指向,能夠經過指針修改指向變量的值
eg:int * const p;
③.const 修飾形參變量:函數內部不可以改變這個參數的值。
④.const 修飾返回值:主要用於函數返回const引用,不可以經過函數返回的引用對實際對象進行任何修改。
11.c++中static關鍵字?
①.修飾全局變量:限制該變量做用域。只能做用域本文件,即便其餘文件用extren聲明也不能夠。
②.修飾局部變量:延長變量生命週期到程序結束。
③.修飾函數:限制做用域,只能做用域本文件,即便其餘文件用extren聲明也不能夠。
④.修飾類成員函數.該成員函數爲靜態成員函數,沒有this指針,它僅能訪問類的靜態數據和靜態成員函數。
⑤.對於類的成員函數,有時候必須指定其返回值爲const類型,以使得其返回值不爲「左值」。
12. 什麼是多態?
①.定義:「一個接口,多種方法」,程序在運行時才決定調用的函數。
②.實現:多態主要經過虛函數實現。
③.目的:接口重用。
④.用法:聲明基類指針,利用該指針指向任意一個子類對象,調用相應的虛函數,能夠根據指向的子類的不一樣而實現不一樣的方法。
13.多態類中的虛函數表什麼時候創建的?
①.虛函數表是在編譯時創建的,各個虛擬函數這時被組織成了一個虛擬函數的入口地址的數組。
虛表指針是在運行期,也就是構造函數被調用時進行初始化的。是實現多態的關鍵。
14. sizeof一個空類的大小?
①.類的實例化是在內存中分配一塊地址,每一個實例在內存中都有獨一無二的二地址。
一樣,空類也會實例化,因此編譯器會給空類隱含的添加一個字節,這樣空類實例化後就有獨一無二的地址了。
因此,空類的sizeof爲1,而不是0.
15.內存分配指針的方式有幾種?
①.從靜態存儲區分配:例如全局變量。程序結束釋放。
②.棧區建立,局部變量等在函數執行結束自動釋放。
③.堆區分配,即動態分配,又malloc或new 申請,free或delete釋放,生存週期由程序員控制。
16.全局變量和局部變量的區別,編譯器如何識別?
①.生命週期不一樣:
全局變量隨主程序的建立而建立,銷燬而銷燬。
局部變量在局部函數內,函數結束就銷燬。
②.編譯器經過內存分配的位置識別,全局變量分配在全局數據段,局部變量分配在棧區。
17.Heap與Stack的差異?
①.Heap是堆,空間由程序員手動分配與釋放。stack是棧,
②.stack是棧,空間由系統自動分配與釋放。
18.c++中explicit關鍵字
①.explicit關鍵字用於修飾類的構造函數,代表該類的構造函數是顯示,使用者必須顯示調用。
19. 重複屢次fclose一個打開過一次的FILE *fp指針會有什麼結果?請解釋。
①.致使文件描述符結構中的指針被重複釋放,進而致使不可預期的異常。
20.面向對象的三個基本特徵,並簡單敘述。
①.封裝:將客觀事物抽象成類,每一個類對自身的數據和方法實行保護(protect private public)
②.繼承:廣義上的繼承有三種方式:
1)實現繼承(指的是使用基類的屬性和方法而無需額外編碼的能力)
2)可視繼承(子窗體使用父窗體的外觀和實現代碼)
3)接口繼承(僅使用屬性和方法,實現滯後到子類實現。
前兩種(類繼承)和後一種(對象組合=>接口繼承以及純虛函數)構成了功能複用的兩種方式。
③.多態:是將父對象設置成爲和一個或更多的與他的子對象相等的技術。
父類指針能夠根據子類對象的特性以不一樣的方式運做。簡單說就是容許將子類類型的指針賦值個父類類型的指針。
簡而言之,就是接口重用。
21.多態的做用?
①.隱藏實現細節,是的代碼可以模塊化;擴展代碼模塊,實現代碼重用。
②.接口重用:爲了類在繼承和派生的時候,保證使用家族中任一類實例的某一屬性時的正確調用。
22.重載、覆蓋、隱藏 的區別?
①.重載:同一個名字空間 容許存在函數名相同,參數列表不一樣。
②.覆蓋:不一樣名字空間 用於繼承,子類從新定義父類虛函數的方法
③.隱藏:不一樣名字空間 派生類與基類的函數同名,屏蔽基類的函數。
23.c++裏面是否是全部的動做都是由main()函數引發的?
①.全局變量的初始化。
24. 析構函數的用法和做用?
①.析構函數是特殊的成員函數,沒有返回類型,沒有參數,在對象銷燬時有系統自動調用。
②.析構函數能夠被virtual修飾(構造函數不能virtual修飾,不存在虛構造)
25.c++中爲何用模板類?
①.編譯時檢查數據類型,保證類型安全。
②.具備很高的複用性,移植性
③.可用於建立動態增加和減少的數據結構。
26.字符指針、浮點數指針、以及函數指針這三種類型的變量哪一個佔用的內存最大?
①.32位系統下,不論是指向何種對象的指針變量都佔4字節。
27.你是如何使用return語句的?
①.return語句不能返回指向 棧內存的指針或者引用。由於該內存會在函數結束時自動銷燬。
②.須要明白咱們須要返回的是指針仍是引用。
28.delete 與 delete[]的區別?
①.delete只會調用一次析構函數,而delete[]會調用每個成員的析構函數。
29.子類析構時要調用父類析構函數嗎?
①.構造函數調用順序:先調用父類構造函數,在調用子類構造函數。
②.析構函數調用順序:先調用子類析構函數,在調用父類析構函數。
30.虛函數、純虛函數?
①.虛函數:virtual關鍵字修飾,容許派生類對基類虛函數從新定義
②.純虛函數:在基類中保留函數名字,派生類根據須要對它從新進行定義。擁有純虛函數的類稱爲抽象類。抽象類不予許建立對象實例。c++
31.進程與線程的差異:
線程是進程內的一個執行單元,也是進程內的可調度實體。
與進程的區別:
①.調度:線程做爲調度和分配的基本單位,進程做爲擁有資源的基本單位。
②.擁有資源:進程是擁有資源的獨立單位,線程不擁有系統資源,但能夠訪問隸屬於進程的資源
③.系統開銷:在建立或撤銷進程時,系統須要爲進程分配和回收資源,開銷明顯大於建立或撤消線程時的開銷
32.網絡編程中設計併發服務器,使用多進程與多線程 ,請問有什麼區別。
①.進程:子進程得到父進程數據空間、堆和棧的複製品
②.線程:線程是一個更加接近與執行體的概念,它能夠與同進程的其餘線程共享數據,但擁有本身的棧空間,擁有獨立的執行序列。
二者均可以提升系統併發度,提升程序的運行效率。
各有優缺點:線程開銷小,但不利於資源保護,進程則相反。進程多用於分佈式。程序員