(Boolan)C++面向?qū)ο蟾呒?jí)編程(下)學(xué)習(xí)筆記(第二周)

1.vptrvtbl

當(dāng)存在虛函數(shù)就會(huì)出現(xiàn)虛指針vptr指向虛函數(shù)所在位置vtbl

將vptr實(shí)現(xiàn)vtbl內(nèi)容翻譯為C:

(*p->vptr)n;

(* p->vptr[n])(p);

動(dòng)態(tài)綁定: 虛機(jī)制

1.指針

2.向上轉(zhuǎn)型保證安全

3.調(diào)用的是虛函數(shù)

2.this指針

[Template Method]

This->Serialize()實(shí)現(xiàn):

(*(this->vptr)[n])(this) -動(dòng)態(tài)綁定

3.動(dòng)態(tài)綁定

向上轉(zhuǎn)型 : 指針實(shí)現(xiàn)

如 B繼承A

B b;

A a = (A)b;

a.vfunc1(); 此時(shí),是靜態(tài)綁定,調(diào)用的是A類的vfunc1()

A* pa = new B;

pa->vfunc1(); 這里必須是動(dòng)態(tài)綁定啊,這里是指針.

pa = &b;

pa->vfunc1(); 這里依舊是動(dòng)態(tài)綁定.

4.const

void function() const { return data;}

const一般放在成員函數(shù)后頭,不放在全局函數(shù)后頭.

在成員函數(shù)后面加const是屬于簽名, 就是當(dāng)兩個(gè)成員函數(shù)傳參相同,那么加不加const也會(huì)被區(qū)分成兩個(gè)函數(shù).

在內(nèi)存共享的情況下, 要考慮內(nèi)容被更改時(shí)所產(chǎn)生的問(wèn)題.

class template::std::basic_string<..>有如下成員函數(shù):

charT operator[] (int n) const

{ //不必考慮COW}

reference operator[] (int n)

{ //必須考慮COW }

COW: Copy on write

所以這個(gè)類里面, 當(dāng)定義的是常量對(duì)象的時(shí)候,就會(huì)被強(qiáng)制調(diào)用const成員函數(shù), 當(dāng)定義的不是常量對(duì)象,那么就會(huì)調(diào)用非const成員函數(shù).

那么這里,當(dāng)是非常量對(duì)象時(shí), 也可以const成員函數(shù).

規(guī)則:當(dāng)成員函數(shù)的const和non-const版本都存在<>時(shí), const對(duì)象只能調(diào)用const版本, non-const對(duì)象只能調(diào)用non-const版本.

5.關(guān)于New,Delete

new對(duì)象的流程不能更改,但是實(shí)現(xiàn)過(guò)程中的函數(shù)可以被更改.

operator new

operator delete

6.重載::operator new, ::operator new[],::operator delete ,::operator delete[]

在全局當(dāng)中:

Note: 如果你重載了全局的操作符, 所以要額外小心.

這些重載不可以被聲明在一個(gè)namespace中.

//這里的函數(shù)是編譯器去調(diào)用, 所以size是編譯器給出.

void* operator new( size_t size )

{ return malloc(size);}

void* operator new[]( size_t size )

{ return malloc(size);}

void* operator delete(void* ptr )

{ free(ptr);}

void* operator delete[](void* ptr )

{ free(ptr);}

重載 member new , delete

在class里面重載new, delete

class foo{

public:

void* operator new(size_t size);

void operator delete(void *, size_t size); //size為可選

…….

};

那么你在:

foo *a = new foo;

delete a;

就會(huì)調(diào)用上面重載的函數(shù).

new[] , delete[] 也如此.

7.實(shí)例

當(dāng)類中重載了new , delete , 而又想調(diào)用全局的new , delete

可以這樣寫:

::delete a;

string類內(nèi)其實(shí)是一個(gè)指針.

當(dāng)創(chuàng)建一個(gè)數(shù)組的時(shí)候, 內(nèi)存當(dāng)中就會(huì)多分配一個(gè)指針,該指針用于保存當(dāng)前數(shù)組個(gè)數(shù).

8.重載new(),delete()示例

允許重載成員函數(shù)new(….) 其中參數(shù)中,必須有第一個(gè)且第一個(gè)必須是size_t size. 其余參數(shù)以new所指定的placement argument為初值.

Foo* p = new(300,’c’)Foo; //這里是三個(gè)參數(shù)

我們也可以重載類成員函數(shù) operator delete() ,寫出多個(gè)版本. 但他們絕不會(huì)被 通常所使用的delete調(diào)用.只有當(dāng)new所調(diào)用的ctor拋出 異常,才會(huì)調(diào)用這些重載版的operator delete(). 它們只能這樣被調(diào)用,主要用來(lái)歸還未能完全創(chuàng)建成功的對(duì)象所占用的內(nèi)存.

9.Basic_String使用new(extra)擴(kuò)充申請(qǐng)量

Basic_String在重載new()過(guò)后,傳遞了一個(gè)extra參數(shù), 用于后臺(tái)自動(dòng)多申請(qǐng)extra空間。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,505評(píng)論 6 533
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,556評(píng)論 3 418
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 176,463評(píng)論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 63,009評(píng)論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,778評(píng)論 6 410
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 55,218評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,281評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 42,436評(píng)論 0 288
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,969評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,795評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,993評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,537評(píng)論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,229評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 34,659評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 35,917評(píng)論 1 286
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,687評(píng)論 3 392
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,990評(píng)論 2 374

推薦閱讀更多精彩內(nèi)容