當(dāng)前位置:首頁 > 芯聞號 > 充電吧
[導(dǎo)讀]2014年我寫的博客比較少,總結(jié)的也比較少。2015年我絕對不能松懈,畢竟知識不總結(jié)容易遺忘。2014年有很多工作沒完成,比如找個好的大公司實習(xí)結(jié)果來了個小公司、學(xué)習(xí)Java、Python、在gith

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,'