类成员变量与函数指针

类成员变量与函数指针

 

这几天用到类中的指针,作个笔记,以免忘记。

 

测试代码:

 

// 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;
}

 运行结果截图:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值