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