含有指針的類(lèi)(經(jīng)典案例 ?string)
Class with pointer member(s) ? ?
拷貝構(gòu)造 or 拷貝賦值

Big Three(凡帶有指針類(lèi)型,必須寫(xiě)的3個(gè)函數(shù))
String(const String& str); ?//拷貝構(gòu)造
String& operator = (const String& str); ?//拷貝復(fù)制
~String(); ?//析構(gòu)函數(shù)(注意寫(xiě)法,與類(lèi)名相同,前面加~;作用:將動(dòng)態(tài)分配的內(nèi)存釋放掉)




? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 深拷貝

如果沒(méi)有自我賦值的檢查,s2=s2,在第一步將自己的空間釋放后,b也不存在了。這樣程序出錯(cuò)。


stack與heap(棧與堆)





NEW(先分配內(nèi)存 memory,再調(diào)用構(gòu)造函數(shù)ctor)

DELETE(先調(diào)用析構(gòu)函數(shù) dtor,再釋放內(nèi)存 memory)

對(duì)于string而言,


上下cookie的作用——記錄所給你的整個(gè)空間的大?。?br>
灰色部分——debug狀態(tài)下額外需要的空間;
string內(nèi)只有一個(gè)指針,所以是4bit,加上灰色部分8×4,加上cookie2*4,共48,是16的倍數(shù),所以沒(méi)有pad;非debug狀態(tài),指針空間4,上下cookie 2×4,只有12,沒(méi)有到16的邊界,所以加一個(gè)pad(4),總共16


總結(jié)string(1-5 接口設(shè)計(jì);6函數(shù)設(shè)計(jì))
1.防衛(wèi)式聲明;
2.private中放指針,需求空間確定時(shí),動(dòng)態(tài)分配內(nèi)存
private:char* ?m_data;
3.構(gòu)造函數(shù)(通常public,無(wú)返回類(lèi)型?。?,一般給個(gè)默認(rèn)值;
String(const char* ?cstr=0);
4.big three:1.拷貝構(gòu)造;2.拷貝復(fù)制;3.析構(gòu)函數(shù)
String(const String& ?str);?
String& ?operator ?= ?(const String& str);
~ String( ?);
5.考慮其它輔助函數(shù)情況(輸出私有數(shù)據(jù))
?char* ? get_c_str( ) const { return m_data;}
6.將函數(shù)聲明具體化
String::String(const char*? cstr=0);

String::~String( );

String::String(const String&? str);

String&? operator? =? (const String& str);

定義輸出函數(shù)

對(duì)類(lèi)模板,函數(shù)模板及其它的進(jìn)一步補(bǔ)充
1.static(靜態(tài))
語(yǔ)法:在靜態(tài)數(shù)據(jù) 或 函數(shù)前加 static
靜態(tài)函數(shù),專(zhuān)為靜態(tài)數(shù)據(jù)來(lái)準(zhǔn)備。





2.cout

3.類(lèi)模板精華部分




總結(jié):前兩個(gè)例子都是針對(duì)單一 class的 設(shè)計(jì),即,基于對(duì)象的設(shè)計(jì)。
后面的內(nèi)容都是針對(duì) class 之間關(guān)系的探討。
___________________________________________________________
關(guān)于指針(point)

關(guān)于空指針
p=NULL;p=0;p=nullptr; 三者相等。
C++標(biāo)準(zhǔn)規(guī)定,當(dāng)一個(gè)指針類(lèi)型的數(shù)值是0時(shí),認(rèn)為這個(gè)指針是空的。
空指針賦值分區(qū)
這一分區(qū)是進(jìn)程的地址空間中從0x00000000 到 0x0000FFFF 的閉區(qū)間(64K 的內(nèi)存大?。?,這 64K 的內(nèi)存是一塊保留內(nèi)存,不能被程序動(dòng)態(tài)內(nèi)存分配器分配,不能訪問(wèn),也不能使用,保留該分區(qū)的目的是為了幫助程序員捕獲對(duì)空指針的賦值。如果進(jìn)程中的線程試圖讀取或者寫(xiě)入位于這一分區(qū)內(nèi)的內(nèi)存地址,就會(huì)引發(fā)訪問(wèn)違規(guī)。
使用指針注意事項(xiàng):
1.指針變量沒(méi)有被初始化------(錯(cuò)誤)
1、任何指針變量被剛創(chuàng)建時(shí)不會(huì)被自動(dòng)初始化為NULL指針,它的缺省值是隨機(jī)的。所以,指針變量在創(chuàng)建的同時(shí)應(yīng)當(dāng)被初始化,要么將指針設(shè)置為NULL,要么讓它指向合法的內(nèi)存。------(正確做法)
2.指針被free或者delete之后,沒(méi)有設(shè)置為NULL,讓人誤以為這是一個(gè)合法指針------(錯(cuò)誤)
2、free和delete只是把指針?biāo)赶虻膬?nèi)存給釋放掉,此時(shí)需手動(dòng)將指針設(shè)置為null,否則可能引起程序錯(cuò)誤------(正確做法)
3.指針操作超越了變量的作用范圍------(錯(cuò)誤)
3、由于C/C++中指針有++操作,因而在執(zhí)行該操作的時(shí)候,稍有不慎,就容易指針訪問(wèn)越界,訪問(wèn)了一個(gè)不該訪問(wèn)的內(nèi)存,結(jié)果程序崩潰;另一種情況是指針指向一個(gè)臨時(shí)變量的引用,當(dāng)該變量被釋放時(shí),此時(shí)的指針就變成了一個(gè)指向垃圾內(nèi)存的指針------(正確做法)