国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C++對(duì)象模型與this指針

這篇具有很好參考價(jià)值的文章主要介紹了C++對(duì)象模型與this指針。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

目錄

1 成員變量與成員函數(shù)分開存儲(chǔ)

2 this指針

2.1 作用1

2.1.1示例

2.2 作用2

3 空指針訪問成員函數(shù)

4 const修飾成員函數(shù)

4.1示例

4.2 常對(duì)象


1 成員變量與成員函數(shù)分開存儲(chǔ)

在C++中,類內(nèi)的成員變量和成員函數(shù)分開存儲(chǔ)

首先,對(duì)于一個(gè)空對(duì)象,占用內(nèi)存空間為1

?class person
?{
??
?};
??
?void test01()
?{
?  person p;
?  cout << sizeof(p) << endl;
?}

C++對(duì)象模型與this指針

因?yàn)镃++編譯器給每個(gè)空對(duì)象分配1個(gè)字節(jié)空間,防止不同空對(duì)象占用同一塊內(nèi)存空間,便于區(qū)分


只有非靜態(tài)成員變量屬于類的對(duì)象上

在person類中加入一個(gè)非靜態(tài)成員變量

?class person
?{
?  int m_a; // 非靜態(tài)成員變量,屬于類的對(duì)象上
?};
??
?void test02()
?{
?  person p;
?  cout << sizeof(p) << endl;
?}

C++對(duì)象模型與this指針

再加上靜態(tài)成員變量

C++對(duì)象模型與this指針

再加上非靜態(tài)成員函數(shù)

C++對(duì)象模型與this指針

最后加上靜態(tài)成員函數(shù)

C++對(duì)象模型與this指針

總結(jié):只有非靜態(tài)成員變量才屬于類的對(duì)象上

2 this指針

概念:上一節(jié)中我們知道成員變量與成員函數(shù)分開存儲(chǔ),每一個(gè)非靜態(tài)成員函數(shù)只會(huì)產(chǎn)生一份函數(shù)實(shí)例,也就是多個(gè)同類型的對(duì)象共用一塊代碼,而如何區(qū)分究竟是哪個(gè)對(duì)象調(diào)用自己,用到this指針

this指針指向被調(diào)用的成員函數(shù)所屬的對(duì)象

性質(zhì):

  • this指針是隱含在每一個(gè)非靜態(tài)成員函數(shù)內(nèi)的一種指針

  • this指針不需要定義,可以直接使用

2.1 作用1

當(dāng)形參與成員變量同名時(shí),可用this指針加以區(qū)分

2.1.1示例

我們先創(chuàng)建類person和測(cè)試函數(shù)test01,在類內(nèi)創(chuàng)建屬性m_age,函數(shù)person,形參age

?class person
?{
?public:
?  person(int age)
?  {
?    m_age = age;
?  }
?  int m_age;
?};
?void test01()
?{
?  person p(20);
?  cout << p.m_age << endl;
?}

此時(shí)可正常輸出

但是,如果我們將屬性m_age改為age得到這個(gè)

?class person
?{
?public:
?  person(int age)
?  {
?    age = age;
?  }
?  int age;
?};
?void test01()
?{
?  person p(20);
?  cout << p.age << endl;
?}

C++對(duì)象模型與this指針

同顏色的即為同一個(gè)age,無(wú)法正常輸出

在此基礎(chǔ)上,我們?cè)诤瘮?shù)內(nèi)加上this指針

?class person
?{
?public:
?  person(int age)
?  {
?    this->age = age; // 加上this->
?  }
?  int age;
?};

C++對(duì)象模型與this指針

可以發(fā)現(xiàn)3個(gè)age是同源的。此時(shí),this就代表pthis->age == p.age;

C++對(duì)象模型與this指針


2.2 作用2

在類的非靜態(tài)成員函數(shù)中返回對(duì)象本身,可以用return *this;

?class person
?{
?public:
?  person(int age)
?  {
?    this->age = age;
?  }
?  void personAdd(person& p) // 函數(shù)本體age加上參數(shù)P的age
?  {
?    this->age += p.age;
?  }
?  int age;
?};
?void test02()
?{
?  person p1(10);
?  cout << p1.age << endl;
?  person p2(10);
?  cout << p2.age << endl;
?}

C++對(duì)象模型與this指針

而如果我們想要多次加和

?void test02()
?{
?  p2.personAdd(p1);
?  cout << p2.age << endl;
??
?  p2.personAdd(p1).personAdd(p1).personAdd(p1); // 想要多次加和
?  cout << p2.age << endl;
?}

C++對(duì)象模型與this指針

要先修改函數(shù)體返回值

?person& personAdd(person& p) // 而且要引用
?  {
?    this->age += p.age;
?    return *this; // 返回對(duì)象本身
?  }

C++對(duì)象模型與this指針

而如果函數(shù)體返回值不使用引用&,則無(wú)法修改值

C++對(duì)象模型與this指針

因?yàn)檫@樣修改完第一次p2后,返回的是另一個(gè)變量,并且后面第2次開始修改的都是另一個(gè)變量,再另一個(gè)變量

3 空指針訪問成員函數(shù)

C++中空指針也可以調(diào)用成員函數(shù),不過要注意是否用到this指針

如果遇到this指針,加上判斷,防止代碼出錯(cuò)

?class person
?{
?public:
?  void show_name()
?  {
?    cout << "Joyce" << endl;
?  }
?  void show_age()
?  {
?    cout << this->m_age << endl;
?  }
??
?  int m_age;
??
?};
?void test01()
?{
?  person* p = NULL;
?  p->show_age(); // 非法訪問
?  p->show_name();
?}

對(duì)于這段代碼,指針p為NULL,調(diào)用show_name函數(shù)時(shí)可以正常輸出,因?yàn)樗皇呛?jiǎn)單的打印特定的內(nèi)容,而調(diào)用show_age函數(shù)時(shí)將報(bào)錯(cuò),因?yàn)?strong>函數(shù)內(nèi)this->m_age;調(diào)用了this指針的m_age,而this指針為NULL,造成非法訪問

因此,我們?cè)诤瘮?shù)內(nèi)部加上判斷

?void show_age()
?  {
?    if (this == NULL)
?    {
?      return;
?    }
?    cout << this->m_age << endl;
?  }

以此便可以防止代碼為NULL時(shí)出錯(cuò)

4 const修飾成員函數(shù)

常函數(shù):

  • 成員函數(shù)后加const稱該函數(shù)為成員函數(shù)

  • 常函數(shù)不可以修改成員屬性

  • 成員屬性聲明時(shí)加關(guān)鍵字mutable,在常函數(shù)中仍然能修改

4.1示例

接下來(lái)創(chuàng)建person類與函數(shù)show_name;

?class person
?{
?public:
?  void show_name()
?  {
?    this->m_a = 100; // 非 常對(duì)象,可修改
?    this = NULL;// this指針的指向不可修改
?  }
?  int m_a;
?};

C++對(duì)象模型與this指針

因?yàn)?code>this指針本質(zhì)是一個(gè)指針常量,所以其指向(地址)不可修改,但其指向的值可以修改

本質(zhì)person * const this;


不過,如果在函數(shù)加上const,則地址與值都不可修改

本質(zhì)const person \*const this;

C++對(duì)象模型與this指針

不過,如果在常函數(shù)中的屬性的聲明前加上mutable,則可以修改

?class person
?{
?public:
?  void show_name() const // 這里有const
?  {
?    this->m_a = 100; //可修改
?  }
?  mutable int m_a; // 加上const
?};

4.2 常對(duì)象

  • 聲明對(duì)象前加const稱該對(duì)象為常對(duì)象

  • 常對(duì)象只能調(diào)用常函數(shù)

?class person
?{
?public:
?  void show_name() const
?  {
?    this->m_a = 100; 
?  }
?  mutable int m_a;
?  int m_b;
?};
?void test02()
?{
?  person p;
?  p.m_b = 20; 
?}

此時(shí)test02內(nèi)可以修改m_b;接下來(lái)在p前加上const使其變成常對(duì)象

?void test02()
?{
?  const person p;
?  p.m_b = 20; // 不可修改
?  p.m_a = 20; // 可修改
?}

m_b不可修改,而m_a由于前面加了mutable,可以修改

C++對(duì)象模型與this指針


同時(shí),在person類中我們?cè)賱?chuàng)建一個(gè)普通函數(shù)func,嘗試在test函數(shù)中調(diào)用剛才的常函數(shù)和普通函數(shù)

?class person
?{
?public:
?  void show_name() const // 常函數(shù)
?  {
?    this->m_a = 100; 
?  }
?  void func() // 普通函數(shù)
?  {
?    ;
?  }
?  mutable int m_a;
?  int m_b;
?};
??
?void test02()
?{
? ? ?const person p; // 創(chuàng)建常對(duì)象
?  p.show_name(); // 常函數(shù)
?  p.func(); // 普通函數(shù)
?}

C++對(duì)象模型與this指針

無(wú)法調(diào)用,因?yàn)槌?duì)象只能調(diào)用常函數(shù)(因?yàn)槠胀ê瘮?shù)可以修改屬性)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-406193.html

到了這里,關(guān)于C++對(duì)象模型與this指針的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • C++對(duì)象模型與this指針

    C++對(duì)象模型與this指針

    目錄 1 成員變量與成員函數(shù)分開存儲(chǔ) 2 this指針 2.1 作用1 2.1.1示例 2.2 作用2 3 空指針訪問成員函數(shù) 4 const修飾成員函數(shù) 4.1示例 4.2 常對(duì)象 在C++中,類內(nèi)的成員變量和成員函數(shù)分開存儲(chǔ) 首先,對(duì)于一個(gè)空對(duì)象,占用內(nèi)存空間為1 因?yàn)镃++編譯器給每個(gè)空對(duì)象分配1個(gè)字節(jié)空間,防止

    2023年04月09日
    瀏覽(25)
  • 【C++深入淺出】類和對(duì)象上篇(類的基礎(chǔ)、類的模型以及this指針)

    【C++深入淺出】類和對(duì)象上篇(類的基礎(chǔ)、類的模型以及this指針)

    目錄 一. 前言? 二. 面向?qū)ο笈c面向過程 ? ? ? ? 2.1?面向過程 ? ? ? ? 2.2 面向?qū)ο?三. 類的基礎(chǔ)知識(shí) 3.1 類的引入 3.2 類的定義 3.3 成員變量的命名規(guī)則 3.4 封裝 3.5 類的訪問限定符 3.6 類的作用域 3.7 類的實(shí)例化 四. 類的對(duì)象模型 4.1 類對(duì)象的大小 4.2 類對(duì)象的存儲(chǔ)方式 4.3 空

    2024年02月10日
    瀏覽(96)
  • C++day3(類、this指針、類中的特殊成員函數(shù))

    C++day3(類、this指針、類中的特殊成員函數(shù))

    1.類的應(yīng)用實(shí)例 2.定義一個(gè)矩形類(Rectangle),包含私有成員長(zhǎng)(length)、寬(width),定義成員函數(shù): 設(shè)置長(zhǎng)度: void set_len(int l); 設(shè)置寬度: void set_wid(int w); 獲取長(zhǎng)度: int get_len(); 獲取寬度: int get_wid(); 顯示周長(zhǎng)和面積: void show(); 3.必須使用this指針的場(chǎng)合 4.構(gòu)造函數(shù)允許函數(shù)重載 5.構(gòu)造

    2024年02月11日
    瀏覽(21)
  • 【C++初階】三、類和對(duì)象(面向過程、class類、類的訪問限定符和封裝、類的實(shí)例化、類對(duì)象模型、this指針)

    【C++初階】三、類和對(duì)象(面向過程、class類、類的訪問限定符和封裝、類的實(shí)例化、類對(duì)象模型、this指針)

    ========================================================================= 相關(guān)代碼gitee自取 : C語(yǔ)言學(xué)習(xí)日記: 加油努力 (gitee.com) ?========================================================================= 接上期 : 【C++初階】二、入門知識(shí)講解 (引用、內(nèi)聯(lián)函數(shù)、auto、基于范圍的for循環(huán)、指針空值

    2024年02月04日
    瀏覽(23)
  • C++類與對(duì)象&&this指針

    C++類與對(duì)象&&this指針

    從此篇往后,開始了C++的類和對(duì)象的篇章,嗯就說這么多 C語(yǔ)言結(jié)構(gòu)體中只能定義變量,在C++中,結(jié)構(gòu)體內(nèi)不僅可以定義變量,也可以定義函數(shù)。比如: 之前在數(shù)據(jù)結(jié)構(gòu)初階中,用C語(yǔ)言方式實(shí)現(xiàn)的棧,結(jié)構(gòu)體中只能定義變量;現(xiàn)在以C++方式實(shí)現(xiàn), 會(huì)發(fā)現(xiàn)struct中也可以定義函

    2024年02月02日
    瀏覽(18)
  • 0062__對(duì)象指針為NULL,為什么還是可以調(diào)用成員函數(shù)

    對(duì)象指針為NULL,為什么還是可以調(diào)用成員函數(shù)_空對(duì)象指針為什么能調(diào)用函數(shù)_一顆石頭崽兒的博客-CSDN博客

    2024年02月10日
    瀏覽(16)
  • 【c++】類和對(duì)象(二)this指針

    【c++】類和對(duì)象(二)this指針

    ?? 個(gè)人主頁(yè) :Quitecoder ?? 專欄 :c++筆記倉(cāng) 朋友們大家好,本節(jié)內(nèi)容來(lái)到類和對(duì)象第二篇,本篇文章會(huì)帶領(lǐng)大家了解 this指針 首先我們定義一個(gè)日期類date: 我們來(lái)思考這么一個(gè)問題: Date類中有 Init 與 Print 兩個(gè)成員函數(shù),函數(shù)體中沒有關(guān)于不同對(duì)象的區(qū)分,也就是說,d

    2024年04月11日
    瀏覽(24)
  • 【C++】:類和對(duì)象(上)+ this指針

    【C++】:類和對(duì)象(上)+ this指針

    【本節(jié)目標(biāo)】 1.面向過程和面向?qū)ο蟪醪秸J(rèn)識(shí) 2.類的引入 3.類的定義 4.類的訪問限定符及封裝 5.類的作用域 6.類的實(shí)例化 7.類的對(duì)象大小的計(jì)算 8.類成員函數(shù)的this指針 C語(yǔ)言是面向過程的,關(guān)注的是過程,分析出求解問題的步驟,通過函數(shù)調(diào)用逐步解決問題 C++是基于面向?qū)ο?/p>

    2024年02月08日
    瀏覽(23)
  • c++靜態(tài)變量成員函數(shù)和全局函數(shù)的區(qū)別

    靜態(tài)成員函數(shù)和全局函數(shù)在某些方面是相似的,但它們有一些關(guān)鍵的區(qū)別。 靜態(tài)成員函數(shù)是與類相關(guān)聯(lián)的函數(shù),但它們不依賴于特定的類實(shí)例 。這意味著它們可以 在沒有類實(shí)例的情況下被調(diào)用 ,并且沒有隱含的this指針。靜態(tài)成員函數(shù)可以通過類名直接調(diào)用,例如: 靜態(tài)成

    2024年02月08日
    瀏覽(30)
  • 【C++】類與對(duì)象【定義、訪問限定符、this指針】

    【C++】類與對(duì)象【定義、訪問限定符、this指針】

    ????個(gè)人主頁(yè): 秦jh__https://blog.csdn.net/qinjh_?spm=1010.2135.3001.5343 ???系列專欄: http://t.csdnimg.cn/eCa5z ? 目錄 面向過程和面向?qū)ο蟪醪秸J(rèn)識(shí) ?類的引入 類的定義 成員變量命名規(guī)則的建議: 類的訪問限定符及封裝 訪問限定符 ?封裝 類的實(shí)例化 類對(duì)象模型 類對(duì)象的存儲(chǔ)方式 計(jì)

    2024年02月21日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包