類成員變數與函數指標
這幾天用到類中的指標,作個筆記,以免忘記。
測試代碼:
// 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;
}
運行結果: