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

C++類成員指針的實現(xiàn)示例

 更新時間:2026年02月03日 10:09:52   作者:Ralph_Y  
類成員指針是指向類成員的特殊指針,與普通指針不同,它存儲的是成員在類中的偏移量,而非直接內(nèi)存地址,下面就來介紹一下C++類成員指針的使用,感興趣的可以了解一下

一、類成員指針的核心定位

類成員指針是C++中專門指向“類的成員”(而非具體對象的成員)的特殊指針,和普通指針的核心區(qū)別:

  • 普通指針:直接指向內(nèi)存中的某個地址(如變量、函數(shù)的入口地址);
  • 成員指針:不直接指向內(nèi)存地址,而是存儲“成員在類中的偏移量”,必須綁定具體對象/對象指針后才能訪問(因為類的成員屬于對象,而非類本身)。

二、數(shù)據(jù)成員指針

1. 定義語法

指向類的非靜態(tài)數(shù)據(jù)成員的指針,語法格式:

// 格式:類名::* 指針變量名
類型 類名::* 數(shù)據(jù)成員指針名 = &類名::數(shù)據(jù)成員名;

2. 完整示例(可直接運行)

#include <iostream>
using namespace std;

class Person {
public:
    string name;
    int age;
    static int count; // 靜態(tài)數(shù)據(jù)成員(特殊情況)
};
int Person::count = 0; // 靜態(tài)成員初始化

int main() {
    // 1. 定義并賦值:指向Person的age成員
    int Person::*p_age = &Person::age;
    // 指向Person的name成員
    string Person::*p_name = &Person::name;

    // 2. 綁定對象訪問(用.*運算符)
    Person p1{"Alice", 20};
    cout << "Name: " << p1.*p_name << endl; // 輸出Alice
    cout << "Age: " << p1.*p_age << endl;   // 輸出20

    // 3. 綁定對象指針訪問(用->*運算符)
    Person* p2 = &p1;
    p2->*p_age = 21; // 修改age
    cout << "New Age: " << p2->*p_age << endl; // 輸出21

    // 4. 靜態(tài)數(shù)據(jù)成員指針(特殊:和普通指針一樣)
    int* p_count = &Person::count; // 無需Person::*,直接用普通指針
    *p_count = 100;
    cout << "Count: " << Person::count << endl; // 輸出100

    return 0;
}

3. 關(guān)鍵注意點

  • 數(shù)據(jù)成員指針的類型必須嚴(yán)格匹配(如int Person::*不能指向string Person::*);
  • 靜態(tài)數(shù)據(jù)成員不屬于對象,因此指向靜態(tài)數(shù)據(jù)成員的指針是普通指針,而非成員指針;
  • 空類/無數(shù)據(jù)成員的類,其數(shù)據(jù)成員指針的偏移量為0,但依然是合法的成員指針。

三、成員函數(shù)指針

1. 定義語法

指向類的非靜態(tài)成員函數(shù)的指針,語法格式(需匹配返回值、參數(shù)列表、const/volatile限定):

// 格式:返回值 (類名::*)(參數(shù)列表) [const/volatile]
返回值 (類名::* 函數(shù)指針名)(參數(shù)列表) [const] = &類名::成員函數(shù)名;

2. 完整示例(含const成員函數(shù))

#include <iostream>
#include <string>
using namespace std;

class Calculator {
public:
    int add(int a, int b) { return a + b; }
    int sub(int a, int b) const { return a - b; } // const成員函數(shù)
    static int mul(int a, int b) { return a * b; } // 靜態(tài)成員函數(shù)
};

int main() {
    // 1. 指向非const成員函數(shù)
    int (Calculator::*p_add)(int, int) = &Calculator::add;
    // 2. 指向const成員函數(shù)(必須加const限定)
    int (Calculator::*p_sub)(int, int) const = &Calculator::sub;

    // 3. 綁定對象調(diào)用(.*運算符)
    Calculator calc;
    cout << "Add: " << (calc.*p_add)(10, 5) << endl; // 輸出15
    cout << "Sub: " << (calc.*p_sub)(10, 5) << endl; // 輸出5

    // 4. 綁定對象指針調(diào)用(->*運算符)
    Calculator* p_calc = &calc;
    cout << "Add via ptr: " << (p_calc->*p_add)(20, 3) << endl; // 輸出23

    // 5. 靜態(tài)成員函數(shù)指針(特殊:和普通函數(shù)指針兼容)
    int (*p_mul)(int, int) = &Calculator::mul;
    cout << "Mul: " << p_mul(4, 5) << endl; // 輸出20

    return 0;
}

3. 關(guān)鍵注意點

  • 成員函數(shù)指針的括號不可省略(calc.*p_add)(10,5) 不能寫成 calc.*p_add(10,5)(運算符優(yōu)先級問題,.->*優(yōu)先級低于());
  • const成員函數(shù)的指針必須加const限定,否則不匹配(如int (Calculator::*)(int,int) const不能賦值給int (Calculator::*)(int,int));
  • 成員函數(shù)隱含this指針,因此必須綁定對象才能調(diào)用(靜態(tài)成員函數(shù)無this,故無需綁定);
  • 成員函數(shù)指針的大小可能大于普通指針(如64位系統(tǒng)可能占16字節(jié)),因為需要存儲函數(shù)地址+this調(diào)整信息(多繼承場景)。

四、將成員函數(shù)用作可調(diào)用對象

成員函數(shù)指針本身不能直接作為“無上下文的可調(diào)用對象”(如傳給std::thread、std::function、std::for_each等),必須綁定對象/this指針,常用3種方式:

1. 方式1:std::bind(C++11及以上)

最經(jīng)典的方式,將成員函數(shù)與對象綁定,生成可調(diào)用的函數(shù)對象:

#include <iostream>
#include <functional> // 必須包含
using namespace std;

class Printer {
public:
    void print(string msg, int num) {
        cout << msg << ": " << num << endl;
    }
};

int main() {
    Printer p;
    // 綁定成員函數(shù)+對象,固定部分參數(shù)(也可留空參數(shù)用placeholders)
    auto func = bind(&Printer::print, &p, "Number", placeholders::_1);
    // 調(diào)用:只需傳未綁定的參數(shù)
    func(100); // 輸出Number: 100

    return 0;
}

2. 方式2:std::function適配

將成員函數(shù)指針+對象封裝為std::function,適配通用可調(diào)用接口:

#include <iostream>
#include <functional>
using namespace std;

class Math {
public:
    int square(int x) { return x * x; }
};

int main() {
    Math m;
    // 封裝為std::function:參數(shù)列表要匹配成員函數(shù)(隱含this已綁定)
    function<int(int)> f = bind(&Math::square, &m, placeholders::_1);
    cout << f(5) << endl; // 輸出25

    // 也可直接用lambda(更簡潔,見方式3)
    function<int(int)> f2 = [&m](int x) { return m.square(x); };
    cout << f2(6) << endl; // 輸出36

    return 0;
}

3. 方式3:lambda表達(dá)式包裹(推薦,C++11+)

最簡潔、易讀的方式,用lambda捕獲對象/this,包裹成員函數(shù)調(diào)用:

#include <iostream>
#include <thread> // 用于演示線程調(diào)用成員函數(shù)
using namespace std;

class Worker {
public:
    void work(int id) {
        cout << "Worker " << id << " is running" << endl;
    }
};

int main() {
    Worker w;
    // 1. 普通調(diào)用:lambda捕獲對象
    auto func = [&w]() { w.work(1); };
    func(); // 輸出Worker 1 is running

    // 2. 線程調(diào)用成員函數(shù)(核心場景)
    thread t([&w]() { w.work(2); });
    t.join(); // 輸出Worker 2 is running

    // 3. 捕獲this(成員函數(shù)內(nèi)調(diào)用)
    class Test {
    public:
        void call_self() {
            auto f = [this]() { this->work(3); };
            f(); // 輸出Worker 3 is running
        }
        void work(int id) { cout << "Test Worker " << id << endl; }
    };
    Test tst;
    tst.call_self();

    return 0;
}

4. 典型場景:成員函數(shù)作為算法的回調(diào)

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

class Filter {
public:
    bool is_even(int x) { return x % 2 == 0; }
};

int main() {
    vector<int> nums = {1,2,3,4,5};
    Filter f;
    // 用lambda包裹成員函數(shù),作為find_if的謂詞
    auto it = find_if(nums.begin(), nums.end(), [&f](int x) {
        return f.is_even(x);
    });
    if (it != nums.end()) {
        cout << "First even number: " << *it << endl; // 輸出2
    }

    return 0;
}

五、核心對比:成員指針 vs 普通指針

特性普通指針(如int*、void(*)(int))類成員指針(如int A::、void (A::)(int))
指向目標(biāo)內(nèi)存地址(變量/函數(shù)入口)類成員的偏移量(需綁定對象)
大小固定(64位=8字節(jié))可能更大(如多繼承場景=16字節(jié))
調(diào)用/訪問方式直接解引用(*p、p())需綁定對象,用.* / ->* 運算符
靜態(tài)成員適配完全兼容靜態(tài)成員的指針等價于普通指針
this指針非靜態(tài)成員函數(shù)指針隱含this,需綁定對象

總結(jié)

  1. 成員指針本質(zhì):存儲類成員的偏移量,而非直接內(nèi)存地址,必須綁定對象才能訪問/調(diào)用;
  2. 語法關(guān)鍵:數(shù)據(jù)成員指針用類名::*,成員函數(shù)指針需匹配返回值/參數(shù)/const限定,調(diào)用用.*/->*
  3. 可調(diào)用對象適配:優(yōu)先用lambda表達(dá)式包裹成員函數(shù)(簡潔無坑),其次用std::bind,避免直接傳遞成員函數(shù)指針;
  4. 特殊情況:靜態(tài)成員的指針等價于普通指針,無需綁定對象即可使用。

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

您可能感興趣的文章:

相關(guān)文章

  • 詳解C++中的const和constexpr

    詳解C++中的const和constexpr

    這篇文章主要為大家介紹了C++中的const和constexpr ,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12
  • Qt 信號自定義槽函數(shù)的實現(xiàn)

    Qt 信號自定義槽函數(shù)的實現(xiàn)

    Qt中實現(xiàn)自定義信號與槽函數(shù),信號用于發(fā)送并觸發(fā)槽函數(shù),槽函數(shù)則是具體的功能實現(xiàn),本文就詳細(xì)的介紹一下如何使用,感興趣的可以了解一下
    2021-11-11
  • C++實現(xiàn)下載的代碼

    C++實現(xiàn)下載的代碼

    這篇文章主要介紹了C++實現(xiàn)下載的代碼,以下載百度圖片為例較為完整的講述了C++下載的具體實現(xiàn)方法,需要的朋友可以參考下
    2014-10-10
  • Qt?QTableWidget?實現(xiàn)行選中及行懸浮高亮效果

    Qt?QTableWidget?實現(xiàn)行選中及行懸浮高亮效果

    使用Qt開發(fā)中,實現(xiàn)表格的行選中和懸浮高亮效果是一個常見需求,但Qt自帶的方法無法直接實現(xiàn),解決方案是通過子類化QStyledItemDelegate并重寫其paint函數(shù)來定制化繪制過程,本文給大家介紹Qt?QTableWidget?實現(xiàn)行選中及行懸浮高亮效果,感興趣的朋友一起看看吧
    2024-09-09
  • C語言匯編分析傳遞結(jié)構(gòu)體指針比傳遞結(jié)構(gòu)體變量高效的深層原因

    C語言匯編分析傳遞結(jié)構(gòu)體指針比傳遞結(jié)構(gòu)體變量高效的深層原因

    本文章使用的工具是vs2010,本篇文章主要講解結(jié)構(gòu)體指針作為參數(shù)傳遞與結(jié)構(gòu)體變量作為參數(shù)傳遞的對比,不談值傳遞與址傳遞的概念
    2022-10-10
  • C語言 文件操作解析詳解及實例代碼

    C語言 文件操作解析詳解及實例代碼

    這篇文章主要介紹了C語言 文件操作解析詳解及實例代碼的相關(guān)資料,需要的朋友可以參考下
    2016-11-11
  • 關(guān)于大小端、位域的一些概念詳解

    關(guān)于大小端、位域的一些概念詳解

    我們常用的x86結(jié)構(gòu)都是小端模式,而大部分DSP,ARM也是小端模式,不過有些ARM是可以選擇大小端模式。所以對于上面的maxHeight是應(yīng)該以小端模式來存放,具體情況請看下面兩表
    2013-10-10
  • C++解析wav文件方法介紹

    C++解析wav文件方法介紹

    最近將項目改為跨平臺,于是音頻模塊從微軟的XAudio2改用OpenAL庫。之前使用MSDN的代碼,所以現(xiàn)在改為了C++標(biāo)準(zhǔn)的寫法,適用性更廣
    2022-09-09
  • 詳解C++字符串常用操作函數(shù)(查找、插入、截取、刪除等)

    詳解C++字符串常用操作函數(shù)(查找、插入、截取、刪除等)

    這篇文章主要介紹了C++字符串常用操作函數(shù)(查找、插入、截取、刪除等),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • 二進(jìn)制、八進(jìn)制?、十進(jìn)制、十六進(jìn)制之間轉(zhuǎn)換的原理詳解

    二進(jìn)制、八進(jìn)制?、十進(jìn)制、十六進(jìn)制之間轉(zhuǎn)換的原理詳解

    本文介紹了進(jìn)制的概念及其在C語言編程中的應(yīng)用,進(jìn)制是進(jìn)位制的簡稱,描述了數(shù)值在不同進(jìn)制下的表示方法,常見的進(jìn)制包括二進(jìn)制、八進(jìn)制和十六進(jìn)制,二進(jìn)制使用0和1表示,八進(jìn)制使用0-7數(shù)字表示,十六進(jìn)制使用0-9和A-F表示,文章還介紹了如何在不同進(jìn)制之間進(jìn)行轉(zhuǎn)換
    2024-11-11

最新評論

乌兰察布市| 民县| 五莲县| 高碑店市| 盱眙县| 嘉祥县| 连山| 依安县| 望江县| 绥宁县| 绵竹市| 攀枝花市| 抚远县| 洪洞县| 衡东县| 海阳市| 井陉县| 水富县| 安图县| 东阿县| 湖北省| 商洛市| 五河县| 奉新县| 南部县| 梅河口市| 红桥区| 将乐县| 汝南县| 常熟市| 淮南市| 酒泉市| 阿拉尔市| 武安市| 手游| 和田县| 镇安县| 余干县| 游戏| 武汉市| 托克逊县|