封裝、成員訪問權(quán)限玉组、內(nèi)存布局谎柄、malloc、free惯雳、new朝巫、delete

C++.png

  • C++中可以使用struct、class來定義一個(gè)類
  • struct和class的區(qū)別
    • struct的默認(rèn)成員權(quán)限是public
    • class的默認(rèn)成員權(quán)限是private
// struct:
struct Person{
    int m_age;
    void run(){
        cout << m_age << endl;
    }
};

//class:
class Person{
public:
    int m_age;
    void run(){
        cout << m_age << endl;
    }
};

// ------------
int main() {
    Person person;
    person.m_age = 10;
    person.run();
    
    Person *pPerson = &person;
    pPerson->m_age = 20;
    pPerson->run();
    return 0;
}


  • 上面代碼中person對象石景、pPerson指針的內(nèi)存都是在函數(shù)的椗常空間,自動(dòng)分配和回收的
  • 可以嘗試反匯編struct和class潮孽,看看是否有其他區(qū)別【無區(qū)別】
  • 實(shí)際開發(fā)中揪荣,用class表示類比較多
C++編程規(guī)范:(變量名規(guī)范參考)
  • 全局變量:g_
  • 成員變量:m_
  • 靜態(tài)變量:s_
  • 常量:c_
  • 使用駝峰標(biāo)識(shí)

ps:每個(gè)人都可以有自己的編程規(guī)范,沒有統(tǒng)一的標(biāo)準(zhǔn)往史,沒有標(biāo)準(zhǔn)答案仗颈,沒有最好的編程規(guī)范


對象的內(nèi)存布局:

思考:如果類中有多個(gè)成員變量,對象的內(nèi)存又是如何布局的?

    Person person;
    person.m_age = 10;
    person.run();
    
// 在函數(shù)里創(chuàng)建對象椎例,用上面的這種方式挨决,它的內(nèi)存存放在棧空間

每個(gè)應(yīng)用都有自己獨(dú)立的內(nèi)存空間订歪,其內(nèi)存空間一般都有以下幾大區(qū)域:

  • 代碼段(代碼區(qū))
    • 用于存放代碼
  • 數(shù)據(jù)段(全局區(qū))
    • 用于存放全局變量等
  • 棽逼恚空間
    • 每調(diào)用一個(gè)函數(shù)就會(huì)給它分配一段連續(xù)的棧空間陌粹,等函數(shù)調(diào)用完畢后會(huì)自動(dòng)回收這段椚鱿空間
    • 自動(dòng)分配和回收
  • 堆空間
    • 需要主動(dòng)去申請和釋放
// 應(yīng)用的內(nèi)存空間布局:
|-------------------|
|                   |
|       棧空間      |
|-------------------|
|       堆空間      |
|-------------------|
|       代碼區(qū)      |
|-------------------|
|       全局區(qū)      |
|                   |
|-------------------|
堆空間
  • 堆空間的申請\釋放
    • malloc \ free
    • new \ delete
    • new [] \ delete []
  • 注意
    • 申請堆空間成功后掏秩,會(huì)返回那一段內(nèi)存空間的地址
    • 申請和釋放必須是1對1的關(guān)系或舞,不然可能會(huì)存在內(nèi)存泄露
  • 現(xiàn)在的很多高級(jí)編程語言不需要開發(fā)人員去管理內(nèi)存(比如Java),屏蔽了很多內(nèi)存細(xì)節(jié)蒙幻,利弊同時(shí)存在
    • 利:提高開發(fā)效率映凳,避免內(nèi)存使用不當(dāng)或泄露
    • 弊:不利于開發(fā)人員了解本質(zhì),永遠(yuǎn)停留在API調(diào)用和表層語法糖邮破,對性能優(yōu)化無從下手

堆空間的初始化
    // *p1未初始化
    int *p1 = (int *)malloc(sizeof(int));
    int *p2 = (int *)malloc(sizeof(int));
    // 把*p2的每一個(gè)字節(jié)都初始化為0
    memset(p2, 0, sizeof(int));
    int *p1 = new int;      // 未初始化
    int *p2 = new int();    // 初始化為0
    int *p3 = new int(5);   // 初始化為5
    int *p4 = new int[3];   // 未初始化
    int *p5 = new int[3](); // 3個(gè)數(shù)組元素初始化為0
    int *p6 = new int[3]{}; // 3個(gè)數(shù)組元素初始化為0
    int *p7 = new int[3]{5};// 數(shù)組首元素初始化為5诈豌,其他初始化為0
memset

memset函數(shù)是將較大的數(shù)據(jù)結(jié)構(gòu)(比如對象仆救、數(shù)組等)內(nèi)存清零的比較快的方法

    Person person;
    person.m_id = 10;
    person.m_age = 10;
    person.m_height = 10;
    memset(&person, 0, sizeof(person));
    
    Person persons[] = {{0,3,105},{1,4,174},{2,6,182}};
    memset(persons, 0, sizeof(persons));

ps:memset分配幾個(gè)字節(jié),是由操作系統(tǒng)底層實(shí)現(xiàn)的

對象的內(nèi)存

  • 對象的內(nèi)存可以存在于3種地方
    • 全局區(qū)(數(shù)據(jù)段):全局變量
    • 椡危空間:函數(shù)里面的局部變量
    • 堆空間:動(dòng)態(tài)申請內(nèi)存(malloc、new等)
// 全局區(qū)
Person g_person;

int main() {
    // 棧區(qū)
    Person person;
    // 堆區(qū)
    Person *p = new Person;
    return 0;
}

this

  • 隱式參數(shù)

  • 匯編長啥樣庙洼?

  • this是指向?qū)ο蟮闹羔?/p>

  • 是語法糖

  • 通過指針修改對象成員變量的匯編樣子

  • 指針間接訪問效率顿痪,不見得就比對象高,但是蚁袭,有的地方必須使用指針,例如删性,堆空間,另外汗侵,方便

  • int3群发,CC CC

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末熟妓,一起剝皮案震驚了整個(gè)濱河市起愈,隨后出現(xiàn)的幾起案子抬虽,更是在濱河造成了極大的恐慌阐污,老刑警劉巖序苏,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件忱详,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門黎比,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人颓帝,你說我怎么就攤上這事窝革∨耙耄” “怎么了?”我有些...
    開封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵侮攀,是天一觀的道長供鸠。 經(jīng)常有香客問我正林,道長觅廓,這世上最難降的妖魔是什么杈绸? 我笑而不...
    開封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘魔吐。我一直安慰自己画畅,他們只是感情好宋距,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著雳灵,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼绸罗。 笑死育灸,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼倒槐!你這毒婦竟也來了讨越?” 一聲冷哼從身側(cè)響起永毅,我...
    開封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬榮一對情侶失蹤县钥,失蹤者是張志新(化名)和其女友劉穎蠢沿,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體雪侥,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡吭历,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年通贞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了遣总。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片圆米。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡昙楚,死狀恐怖爆袍,靈堂內(nèi)的尸體忽然破棺而出压语,到底是詐尸還是另有隱情舵揭,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布驹吮,位于F島的核電站智润,受9級(jí)特大地震影響窟绷,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜辐怕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望合砂。 院中可真熱鬧青扔,春花似錦、人聲如沸翩伪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缘屹。三九已至凛剥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間轻姿,已是汗流浹背犁珠。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留互亮,地道東北人盲憎。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像胳挎,于是被迫代替她去往敵國和親饼疙。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

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

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,113評(píng)論 1 32
  • 最全的iOS面試題及答案 iOS面試小貼士 ———————————————回答好下面的足夠了-----------...
    zweic閱讀 2,706評(píng)論 0 73
  • __block和__weak修飾符的區(qū)別其實(shí)是挺明顯的:1.__block不管是ARC還是MRC模式下都可以使用慕爬,...
    LZM輪回閱讀 3,329評(píng)論 0 6
  • 多線程窑眯、特別是NSOperation 和 GCD 的內(nèi)部原理。運(yùn)行時(shí)機(jī)制的原理和運(yùn)用場景医窿。SDWebImage的原...
    LZM輪回閱讀 2,009評(píng)論 0 12
  • 寧心默默小淵靜磅甩, 幽谷寂寂淡相迎。 罷刀窗外丹江傾姥卢, 煮酒松下品眾生卷要。
    青牛踏雪御蒼穹閱讀 289評(píng)論 0 1