欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++學習筆記之類成員指針

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

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

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

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

struct point2{
	int c[3];
};

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

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

讓member指針指向A中的成員x,且類型是int,此時我們就可以通過member來訪問x:

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

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

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

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

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

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

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

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

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

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

補充:mem_fn

通過mem_fn對類函數(shù)成員指針進行包裝,來返回一個可調(diào)用對象。使用時,包含頭文件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;
}

運行

總結(jié)

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

相關文章

  • C語言單雙線性及循環(huán)鏈表與實例

    C語言單雙線性及循環(huán)鏈表與實例

    這篇文章主要介紹了C語言的單鏈表、雙鏈表和循環(huán)鏈表,還有一些相關的實例,感興趣的同學可以借鑒一下
    2023-03-03
  • c++ 動態(tài)內(nèi)存分配相關總結(jié)

    c++ 動態(tài)內(nèi)存分配相關總結(jié)

    這篇文章主要介紹了c++ 動態(tài)內(nèi)存分配相關的相關資料,幫助大家更好的理解和學習和使用c++,感興趣的朋友可以了解下
    2021-02-02
  • C語言實現(xiàn)單鏈表實現(xiàn)方法

    C語言實現(xiàn)單鏈表實現(xiàn)方法

    這篇文章主要介紹了C語言實現(xiàn)單鏈表實現(xiàn)方法的相關資料,鏈表分為單向鏈表、雙向鏈表、循環(huán)鏈表,需要的朋友可以參考下
    2017-08-08
  • C語言中的內(nèi)存泄露 怎樣避免與檢測

    C語言中的內(nèi)存泄露 怎樣避免與檢測

    堆經(jīng)常會出現(xiàn)兩種類型的問題:1.釋放或改寫仍在使用的內(nèi)存(稱為:“內(nèi)存損壞”)。2.未釋放不再使用的內(nèi)存(稱為:“內(nèi)存泄露”)。這是最難被調(diào)試發(fā)現(xiàn)的問題之一
    2013-09-09
  • C語言實現(xiàn)簡單計算器

    C語言實現(xiàn)簡單計算器

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)簡單計算器,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • C++類成員初始化的三種方式

    C++類成員初始化的三種方式

    如果靜態(tài)成員不滿足常量性,則不可以就地聲明,而且即使常量的靜態(tài)成員也只能是整型或者枚舉型才能就地初始化。而非靜態(tài)成員變量的初始化則必須在構(gòu)造函數(shù)中進行。首先,先得了解一下C++支持哪幾種類成員初始化的方式,下面我們就來看看具體內(nèi)容吧
    2021-09-09
  • C的|、||、&、&&、異或、~、!運算符

    C的|、||、&、&&、異或、~、!運算符

    這篇文章主要介紹了C的|、||、&、&&、異或、~、!運算符,需要的朋友可以參考下
    2014-06-06
  • C語言實現(xiàn)簡易訂餐系統(tǒng)

    C語言實現(xiàn)簡易訂餐系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)簡易訂餐系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • 詳解C語言解決經(jīng)典問題之兔子產(chǎn)子

    詳解C語言解決經(jīng)典問題之兔子產(chǎn)子

    有一對兔子,從出生后的第 3 個月起每個月都生一對兔子。小兔子長到第 3 個月后每個月又生一對兔子,假設所有的兔子都不死,問 30 個月內(nèi)每個月的兔子總數(shù)為多少?本文將用C語言解決這一經(jīng)典問題,需要的可以參考一下
    2022-03-03
  • C++手擼智能指針的教程分享

    C++手擼智能指針的教程分享

    在前文中小編為大家介紹了C++智能指針的一些使用方法和基本原理,所以本文就來自己動手,從0到1實現(xiàn)一下自己的unique_ptr和shared_ptr吧
    2023-05-05

最新評論