類成員變數與函數指標

來源:互聯網
上載者:User

類成員變數與函數指標

 

這幾天用到類中的指標,作個筆記,以免忘記。

 

測試代碼:

 

// OffSetOf.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#define OFFSET(s, m) \
 ((size_t)&((s*)0)->m)

typedef struct _Test
{
 char a;
 double b;
 int c;
}TEST;

class TEST_T
{
public:
 int MAX(int one, int two)
 {
  return (one >= two)?one:two;
 }

 virtual int MIN(int one, int two)
 {
  return (one < two)?one:two;
 }

 static int add(int one, int two)
 {
  return (one + two);
 }

 int obj;     //公用成員
 static int obj_static;

private:
 int obj_private;   //私人成員
};

int TEST_T::obj_static = 10;

int _tmain(int argc, _TCHAR* argv[])
{
 /*offset測試*/
 printf("\n變數a的位移為:%d", OFFSET(TEST, a));
 printf("\n變數b的位移為:%d", OFFSET(TEST, b));
 printf("\n變數c的位移為:%d", OFFSET(TEST, c));

 /*類的函數指標測試*/

 //1. 類中普通對象指標的使用
 typedef int *pObj;               //聲明類成員變數的指標類型

 TEST_T test_obj;

 pObj pTest_Obj = &test_obj.obj;  //將成員變數的地址付給指標pTest_Obj

 *pTest_Obj = 10;

 printf("\n\n*pTest_Obj = %d", *pTest_Obj);

 //2. 類中static對象指標的使用
 pObj pTest_Static = &TEST_T::obj_static;   //靜態成員屬於類而不是對象,所以用::的方式去取得對象

 *pTest_Static = 100;

 printf("\n\n*pTest_Static = %d", *pTest_Static);

 //3. 類中的靜態函數指標的測試
 typedef int (*pStatic)(int, int);

 TEST_T test_static;

 pStatic pAdd1 = test_static.add;
 pStatic pAdd2 = TEST_T::add;

 printf("\n\npAdd1(10, 10) =  %d", pAdd1(10, 10));
 printf("\npAdd2(10, 10) =  %d", pAdd2(10, 20)); //可以看出,和普通的使用方式也一樣

 //4. 類中的普通成員指標的測試
 typedef int (TEST_T::*pMAX)(int, int);  //聲明類成員函數的指標類型

 TEST_T test_normal;

 pMAX pNormalMAX = &TEST_T::MAX;  //聲明成員函數指標變數並 初始化

 //pMAX pNormalMAX2 = test_normal.MAX;  //錯誤的使用方式
 //pMAX pNormalMAX3 = &test_normal.MAX; //錯誤的使用方式
 //pMAX pNormalMAX4 = TEST_T::MAX;      //錯誤的使用方式

 pMAX pVirtualMIN = &TEST_T::MIN;  //聲明成員函數指標變數並 初始化

 //pMAX pVirtualMIN2 = test_normal.MIN;   //錯誤的使用方式
 //pMAX pVirtualMIN3 = &test_normal.MIN;  //錯誤的使用方式
 //pMAX pVirtualMIN4 = TEST_T::MIN;       //錯誤的使用方式

 //pMAX pStaticADD = TEST_T::add;  //錯誤的使用方式,靜態函數屬於全域函數,應該使用普通範圍的函數指標

 //printf("\npNormalMAX(10, 40) =  %d", pNormalMAX(10, 40));  //錯誤的使用方式
 //printf("\npVirtualMIN(10, 20) =  %d", pVirtualMIN(10, 20));//錯誤的使用方式
 //printf("\npStaticADD(10, 20) =  %d", pStaticADD(10, 20));  //錯誤的使用方式

 printf("\n\n(test_normal.*pNormalMAX)(10, 40) =  %d", (test_normal.*pNormalMAX)(10, 40));  //正確的使用方式[使用對象和成員函數指標調用成員函數]
 printf("\n(test_normal.*pVirtualMIN)(10, 20) =  %d", (test_normal.*pVirtualMIN)(10, 20));//正確的使用方式

 //5. 使用指標
 TEST_T *pTest_normal = &test_normal;
 printf("\n\n(pTest_normal->*pNormalMAX)(10, 40) =  %d", (pTest_normal->*pNormalMAX)(10, 40));  //正確的使用方式[使用對象和成員函數指標調用成員函數]
 printf("\n(pTest_normal->*pVirtualMIN)(10, 20) =  %d", (pTest_normal->*pVirtualMIN)(10, 20));//正確的使用方式

 /*總結:
   在類中的靜態成員函數指標和類成員變數的指標,和普通的全域函數和普通對象指標的使用方式一樣。
   在類中的非靜態成員函數,只能使用[&Class_Name::Function_Name,即&類名::函數名]的方式去取的其函數地址,
   因為函數是屬於類,而不是某個對象,所以不能用[對象名.函數名]的方式去取的其函數地址。
    */
 getchar();

 return 0;
}

 運行結果:

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.