最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++學(xué)習(xí)筆記之類成員指針

 更新時(shí)間:2022年04月21日 09:35:14   作者:Ofnoname  
類成員指針時(shí)指可以指向類的非靜態(tài)成員的指針,下面這篇文章主要給大家介紹了關(guān)于C++類成員指針的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

C++的類成員指針是一種奇葩的指針。

假設(shè)現(xiàn)在我們要表示一個(gè)三維的點(diǎn),現(xiàn)在有兩種定義方式:

struct point1{
	int x, y, z;
};

struct point2{
	int c[3];
};

第一種的優(yōu)點(diǎn)是更直觀,但第二種可以方便的用for遍歷三個(gè)屬性。最終我選擇了第一種,但是我還想弄一個(gè)遍歷功能怎么辦?這個(gè)時(shí)候類成員指針就排上用場(chǎng)了,我們可以創(chuàng)建一個(gè)“指向point中具體成員的指針”。

int A:: *member = &A::x;

讓member指針指向A中的成員x,且類型是int,此時(shí)我們就可以通過(guò)member來(lái)訪問(wèn)x:

point1 tmp{4, 5, 6};
cout << tmp.(*member); //把member解引用,得到tmp::x,表示要訪問(wèn)x

所以我們定義一個(gè)數(shù)組,就可以迭代訪問(wèn)類里的各種int屬性了

int A:: *member [] = {&A::x, &A::y, &A::z};
for (int i = 0; i < 3; ++i)
	cout << tmp.(*member[i]);

這個(gè)用途也可以放到成員函數(shù)上,構(gòu)建一個(gè)函數(shù)列表,順序調(diào)用。

這么個(gè)指針的行為跟一般的指針顯然不一樣,它不保存地址,而是保存一個(gè)“偏移量”,從對(duì)象地址開頭到對(duì)象成員的偏移量。這玩意其實(shí)可以輸出:

struct A{
	int a, b, c;
};

main() {
	printf("%d%d%d", &A::a, &A::b, &A::c); //! 輸入為0, 4, 8
	//! 當(dāng)然這玩意類型不是int,printf直接將他以int解析輸出了,所以cout達(dá)不到效果
}

這樣類成員指針的意義就很明顯了,假設(shè)一個(gè)A的對(duì)象t,那么t的地址&t和a的地址&(t.a)是相等的,而&(t.b)要多出來(lái)4,&(t.c)又要多出來(lái)4。每個(gè)對(duì)象的內(nèi)存構(gòu)造都是一樣的,這個(gè)類成員指針就是獲取每個(gè)成員相對(duì)于頭地址的偏移量,這樣當(dāng)我使用t.*member編譯器就知道是頭地址+4處的變量,并且是個(gè)int。

不過(guò)成員函數(shù)又不太一樣了。不同對(duì)象的成員函數(shù)只有同一份程序短代碼。C++不能用&(t.fun)的方式獲取對(duì)象的成員函數(shù)的地址,要用取&A::fun得到函數(shù)的地址。這個(gè)當(dāng)然是真地址了。

類成員指針可以用于static嗎?顯然不行,static成員單獨(dú)存放,與類本身無(wú)關(guān),取&A::staticmember得到的就是這個(gè)變量的正經(jīng)地址。那可以用于virtual function嗎?答案是可以,但是虛函數(shù)的地址無(wú)法確定,所以又變成了儲(chǔ)存偏移量,實(shí)際上儲(chǔ)存的是函數(shù)在虛表中的索引值。

補(bǔ)充:mem_fn

通過(guò)mem_fn對(duì)類函數(shù)成員指針進(jìn)行包裝,來(lái)返回一個(gè)可調(diào)用對(duì)象。使用時(shí),包含頭文件functional。

#include <iostream>
#include <functional>
using namespace std;
class Compute
{
public:
    Compute(int a, int b) :a(a), b(b)
    {
 
    }
    int add()
    {
        return a + b;
    }
    int sub() const
    {
        return a - b;
    }
private:
    int a;
    int b;
};
int main(void)
{
    Compute com(100, 10), *p = &com;
    auto fun1 = mem_fn(&Compute::add);
    cout << fun1(com) << endl;
    cout << fun1(p) << endl;
    auto fun2 = mem_fn(&Compute::sub);
    cout << fun2(com) << endl;
    cout << fun2(p) << endl;
    cin.get();
    return 0;
}

運(yùn)行

總結(jié)

到此這篇關(guān)于C++學(xué)習(xí)筆記之類成員指針的文章就介紹到這了,更多相關(guān)C++類成員指針內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++中缺省參數(shù)的使用

    C++中缺省參數(shù)的使用

    C++缺省參數(shù)可在聲明或定義時(shí)設(shè)定默認(rèn)值,調(diào)用時(shí)若未提供實(shí)參則自動(dòng)使用,分為全缺省與半缺省,下面就來(lái)詳細(xì)的介紹一下缺省參數(shù)的使用,感興趣的可以了解一下
    2025-07-07
  • C++ LeetCode1832題解判斷句子是否為全字母句

    C++ LeetCode1832題解判斷句子是否為全字母句

    這篇文章主要為大家介紹了C++ LeetCode1832題解判斷句子是否為全字母句示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • C語(yǔ)言數(shù)組超詳細(xì)講解下篇掃雷

    C語(yǔ)言數(shù)組超詳細(xì)講解下篇掃雷

    數(shù)組是一組有序的數(shù)據(jù)的集合,本篇將帶你結(jié)合數(shù)組來(lái)實(shí)現(xiàn)掃雷小游戲,上手實(shí)練更快的能夠掌握數(shù)組使用,感興趣的朋友來(lái)看看吧
    2022-04-04
  • c++ signal實(shí)現(xiàn)發(fā)送信號(hào)

    c++ signal實(shí)現(xiàn)發(fā)送信號(hào)

    這篇文章主要為大家詳細(xì)介紹了c++ signal實(shí)現(xiàn)發(fā)送信號(hào)的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-01-01
  • C語(yǔ)言中動(dòng)態(tài)內(nèi)存分配malloc、calloc和realloc函數(shù)解析

    C語(yǔ)言中動(dòng)態(tài)內(nèi)存分配malloc、calloc和realloc函數(shù)解析

    C語(yǔ)言跟內(nèi)存申請(qǐng)相關(guān)的函數(shù)主要有 alloca、calloc、malloc、free、realloc等,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中動(dòng)態(tài)內(nèi)存分配malloc、calloc和realloc函數(shù)的相關(guān)資料,需要的朋友可以參考下
    2022-03-03
  • C++超詳細(xì)講解內(nèi)存空間分配與this指針

    C++超詳細(xì)講解內(nèi)存空間分配與this指針

    this?指針在C++類和對(duì)象中是個(gè)很方便實(shí)用的關(guān)鍵字,可以簡(jiǎn)化對(duì)象成員屬性的調(diào)用,使代碼表達(dá)的含義更加準(zhǔn)確;在之前的學(xué)習(xí)中我們都可以判斷變量所占內(nèi)存空間大小,那么我們創(chuàng)建的類對(duì)象所占的內(nèi)存空間怎么計(jì)算呢?想知道this的妙用和類對(duì)象占用的內(nèi)存空間就來(lái)跟我學(xué)習(xí)吧
    2022-05-05
  • 使用Matlab繪制七夕咕呱小青蛙

    使用Matlab繪制七夕咕呱小青蛙

    七夕節(jié)到了還不快給你的朋友安排上這只咕呱小青蛙?本文將用Matlab繪制一個(gè)可愛(ài)的咕呱小青蛙,感興趣的小伙伴可以動(dòng)手嘗試一下
    2022-08-08
  • 深入解析設(shè)計(jì)模式中的適配器模式在C++中的運(yùn)用

    深入解析設(shè)計(jì)模式中的適配器模式在C++中的運(yùn)用

    這篇文章主要介紹了設(shè)計(jì)模式中的適配器模式在C++中的運(yùn)用,通常適配器模式可以細(xì)分為類適配器和對(duì)象適配器兩種情況,需要的朋友可以參考下
    2016-03-03
  • C語(yǔ)言模式實(shí)現(xiàn)C++繼承和多態(tài)的實(shí)例代碼

    C語(yǔ)言模式實(shí)現(xiàn)C++繼承和多態(tài)的實(shí)例代碼

    本篇文章主要介紹了C語(yǔ)言模式實(shí)現(xiàn)C++繼承和多態(tài)的實(shí)例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • 深入C++可見(jiàn)性與生命期的區(qū)別詳解

    深入C++可見(jiàn)性與生命期的區(qū)別詳解

    本篇文章對(duì)C++中可見(jiàn)性與生命期的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05

最新評(píng)論

文登市| 历史| 双柏县| 佛冈县| 建瓯市| 奎屯市| 清流县| 六枝特区| 商丘市| 阿坝| 甘南县| 湘乡市| 惠来县| 鲁山县| 孝昌县| 平顶山市| 宜川县| 阿合奇县| 阳高县| 衡水市| 肃南| 阿克陶县| 红河县| 中江县| 罗城| 安岳县| 鹰潭市| 沅江市| 杭锦旗| 阆中市| 常州市| 正安县| 邢台市| 长寿区| 大宁县| 凤庆县| 新昌县| 盐池县| 蕲春县| 沙坪坝区| 馆陶县|