求職應(yīng)聘C++復(fù)習(xí)小結(jié)
2014年我寫的博客比較少,總結(jié)的也比較少。2015年我絕對不能松懈,畢竟知識不總結(jié)容易遺忘。2014年有很多工作沒完成,比如找個好的大公司實習(xí)結(jié)果來了個小公司、學(xué)習(xí)Java、Python、在github上搭建自己的個人博客都沒有完成。2015年,有很多事情要做,秋季找正式工作、畢業(yè)論文等,所以更加需要總結(jié)所學(xué)知識,為秋季招聘做準(zhǔn)備。今年年假13天里,學(xué)習(xí)方面只把《C++ Primer》這本書過了一遍。下面是對相關(guān)知識點做的小結(jié)。 ??
構(gòu)造函數(shù)的調(diào)用順序為:調(diào)用基類的構(gòu)造函數(shù)->調(diào)用成員對象的構(gòu)造函數(shù)->調(diào)用自身的構(gòu)造函數(shù),析構(gòu)函數(shù)調(diào)用反之。
9,解釋堆和棧的區(qū)別
答:1、棧區(qū)(stack)—由編譯器自動分配釋放,存放函數(shù)的參數(shù)值,局部變量的值等。其操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧。
由系統(tǒng)自動分配。聲明在函數(shù)中一個局部變量 int b;系統(tǒng)自動在棧中為b開辟空間。
只要棧的剩余空間大于所申請空間,系統(tǒng)將為程序提供內(nèi)存,否則將報異常提示棧溢出。
在Windows下,棧是向低地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu),是一塊連續(xù)的內(nèi)存的區(qū)域,棧的大小是2M。
如果申請的空間超過棧的剩余空間時,將提示overflow。
棧由系統(tǒng)自動分配,速度較快。但程序員是無法控制的。
函數(shù)調(diào)用時,第一個進(jìn)棧的是主函數(shù)中后的下一條指令,的地址,然后是函數(shù)的各個參數(shù)。
在大多數(shù)的C編譯器中,參數(shù)是由右往左入棧的,然后是函數(shù)中的局部變量。注意靜態(tài)變量是不入棧的。
?
堆區(qū)(heap)—一般由程序員分配釋放,若程序員不釋放,程序結(jié)束時可能由OS回收。
注意它與數(shù)據(jù)結(jié)構(gòu)中的堆是兩回事,分配方式倒是類似于鏈表,需要程序員自己申請,并指明大小,在c中malloc函數(shù)
在C++中用new運(yùn)算符。首先應(yīng)該知道操作系統(tǒng)有一個記錄空閑內(nèi)存地址的鏈表,當(dāng)系統(tǒng)收到程序的申請時,
另外,由于找到的堆結(jié)點的大小不一定正好等于申請的大小,系統(tǒng)會自動的將多余的那部分重新放入空閑鏈表中。
堆是向高地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu),是不連續(xù)的內(nèi)存區(qū)域。而鏈表的遍歷方向是由低地址向高地址。
堆的大小受限于計算機(jī)系統(tǒng)中有效的虛擬內(nèi)存。
堆是由new分配的內(nèi)存,一般速度比較慢,而且容易產(chǎn)生內(nèi)存碎片,不過用起來最方便
一般是在堆的頭部用一個字節(jié)存放堆的大小。
11,C++的空類,默認(rèn)產(chǎn)生哪些類成員函數(shù)?
class Empty
{
? public:
? Empty(); //缺省構(gòu)造函數(shù)
? Empty( const Empty& ); //拷貝構(gòu)造函數(shù)
? ~Empty(); //析構(gòu)函數(shù)
? Empty& operator=( constEmpty& ); //賦值運(yùn)算符
? Empty* operator&(); //取址運(yùn)算符
? const Empty* operator&()const; //取址運(yùn)算符 const
};
默認(rèn)構(gòu)造函數(shù) ??
析構(gòu)函數(shù) ??
拷貝構(gòu)造函數(shù) ??
賦值運(yùn)算符(operator=)
??
取址運(yùn)算符(operator&)(一對,一個非const的,一個const的)?
12,談?wù)勵惡徒Y(jié)構(gòu)體的區(qū)別
答:結(jié)構(gòu)體在默認(rèn)情況下的成員都是public的,而類在默認(rèn)情況下的成員是private的。結(jié)構(gòu)體和類都必須使用new創(chuàng)建,
struct保證成員按照聲明順序在內(nèi)存在存儲,而類不保證。
13,const_cast 、static_cast、dymnaic_cast及reinterpreter_cast的區(qū)別?
答:(1)const_cast
字面上理解就是去const屬性,去掉類型的const或volatile屬性。
struct SA{?int k};?const SA ra;??
ra.k = 10;???//直接修改const類型,編譯錯誤??SA& rb =?const_cast
?
(2)static_cast//居中
主要用于基本類型之間和具有繼承關(guān)系的類型之間的轉(zhuǎn)換。用于指針類型的轉(zhuǎn)換沒有太大的意義
static_cast是無條件和靜態(tài)類型轉(zhuǎn)換,可用于基類和子類的轉(zhuǎn)換,基本類型轉(zhuǎn)換,把空指針轉(zhuǎn)換為目標(biāo)類型的空指針,
把任何類型的表達(dá)式轉(zhuǎn)換成void類型,static_cast不能進(jìn)行無關(guān)類型(如非基類和子類)指針之間的轉(zhuǎn)換。
int a;????double d = static_cast
int &pn = &a;????void *p =static_cast
?
(3)dynamic_cast//比較安全的轉(zhuǎn)化
?你可以用它把一個指向基類的指針或引用對象轉(zhuǎn)換成繼承類的對象
動態(tài)類型轉(zhuǎn)換,運(yùn)行時類型安全檢查(轉(zhuǎn)換失敗返回NULL)
基類必須有虛函數(shù),保持多態(tài)特性才能用dynamic_cast
只能在繼承類對象的指針之間或引用之間進(jìn)行類型轉(zhuǎn)換
class BaseClass{public:?int m_iNum;?virtual void foo(){};};
class DerivedClass:BaseClass{public: char*szName[100];?void bar(){};};
BaseClass* pb = new DerivedClass();
?DerivedClass *p2 =dynamic_cast
BaseClass* pParent =dynamic_cast
//子類->父類,動態(tài)類型轉(zhuǎn)換,正確
當(dāng)基類指針指向基類時不能通過這種轉(zhuǎn)化為子類指針
?(4)reinterpreter_cast//最暴力的轉(zhuǎn)化
轉(zhuǎn)換的類型必須是一個指針、引用、算術(shù)類型、函數(shù)指針或者成員指針。
主要是將一個類型的指針,轉(zhuǎn)換為另一個類型的指針
不同類型的指針類型轉(zhuǎn)換用reinterpreter_cast
最普通的用途就是在函數(shù)指針類型之間進(jìn)行轉(zhuǎn)換
int DoSomething(){return 0;};
typedef void(*FuncPtr)(){};
FuncPtr funcPtrArray[10];
funcPtrArray[0] =reinterpreter_cast
16,簡單敘述面向?qū)ο蟮娜齻€基本特征
答:封裝性
把客觀事物封裝成抽象的類,對自身的數(shù)據(jù)和方法進(jìn)行(public,private, protected)
繼承性
繼承概念的實現(xiàn)方式有三類:實現(xiàn)繼承、接口繼承和可視繼承。
實現(xiàn)繼承是指使用基類的屬性和方法而無需額外編碼的能力;
接口繼承是指僅使用屬性和方法的名稱、但是子類必須提供實現(xiàn)的能力;
可視繼承是指子窗體(類)使用基窗體(類)的外觀和實現(xiàn)代碼的能力。
抽象類僅定義將由子類創(chuàng)建的一般屬性和方法,創(chuàng)建抽象類時,請使用關(guān)鍵字 Interface而不是 Class
多態(tài)性
多態(tài)性(polymorphisn)是允許你將父對象設(shè)置成為和一個或更多的他的子對象相等的技術(shù),賦值之后,
父對象就可以根據(jù)當(dāng)前賦值給它的子對象的特性以不同的方式運(yùn)作。允許將子類類型的指針賦值給父類類型的指針。
實現(xiàn)多態(tài),有二種方式,覆蓋(子類重新定義父類的虛函數(shù)),重載(允許存在多個同名函數(shù),參數(shù)個數(shù),類型不同)。
18,什么是預(yù)編譯,何時需要預(yù)編譯
答:就是指程序執(zhí)行前的一些預(yù)處理工作,主要指#表示的.
需要預(yù)編譯的情況:總是使用不經(jīng)常改動的大型代碼體。所有模塊都使用一組標(biāo)準(zhǔn)的包含文件和相同的編譯選項。
http://feihe027.blog.163.com/blog/static/5932583320130256177961/
19,memset ,memcpy和strcpy的根本區(qū)別?
答:memset用來對一段內(nèi)存空間全部設(shè)置為某個字符,一般用在對定義的字符串進(jìn)行初始化為' '或'';
它對較大的結(jié)構(gòu)體或數(shù)組進(jìn)行清零操作的一種最快方法。
char temp[30];????memset(temp,'