第二周(Geek Band)

含有指針的類(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)存釋放掉)

編譯器默認(rèn)的 ?淺拷貝

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


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


輸出函數(shù)的寫(xiě)法

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



少了[ ],1的部分會(huì)被刪掉,2,3沒(méi)有被刪掉,其他灰色部分最后清除了。結(jié)果2.3部分,造成了內(nèi)存泄漏。

總結(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);

構(gòu)造函數(shù)



String::~String( );

析構(gòu)函數(shù)


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



拷貝構(gòu)造


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

拷貝復(fù)制(注意返回類(lèi)型要寫(xiě)明,注意String::放的位置

定義輸出函數(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)備。

成員函數(shù)自帶 this point,寫(xiě)成員函數(shù)是()內(nèi)一定不能寫(xiě)出this,但是{ ?} 內(nèi)可以直接使用 this。調(diào)用對(duì)象,就是this


普通data members :如銀行賬戶,每個(gè)人都是一個(gè),static data members:如利率,所有賬戶的利率都是相同的,一份夠了


static 使用方法(銀行利率舉例)


優(yōu)化的 Singleton ?設(shè)計(jì)模式,將a寫(xiě)在函數(shù)內(nèi)的好處:沒(méi)有人用的時(shí)候就不存在,產(chǎn)生調(diào)用后才出現(xiàn)a,不會(huì)消失,保證唯一1份

2.cout

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

template < typename T>
template <class T>? 同template < typename T>相同


總結(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)存的指針------(正確做法)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • iOS面試小貼士 ———————————————回答好下面的足夠了------------------------...
    不言不愛(ài)閱讀 2,253評(píng)論 0 7
  • __block和__weak修飾符的區(qū)別其實(shí)是挺明顯的:1.__block不管是ARC還是MRC模式下都可以使用,...
    LZM輪回閱讀 3,599評(píng)論 0 6
  • ———————————————回答好下面的足夠了---------------------------------...
    恒愛(ài)DE問(wèn)候閱讀 1,844評(píng)論 0 4
  • 多線程、特別是NSOperation 和 GCD 的內(nèi)部原理。運(yùn)行時(shí)機(jī)制的原理和運(yùn)用場(chǎng)景。SDWebImage的原...
    LZM輪回閱讀 2,128評(píng)論 0 12
  • 好久沒(méi)有畫(huà)石頭了,久到我都不記得上一個(gè)石頭是什么時(shí)候出生的。所以,今天花了一晚上畫(huà)了三個(gè)萌萌噠~ 四個(gè)小...
    _aqu閱讀 260評(píng)論 0 2

友情鏈接更多精彩內(nèi)容