类成员指针和类成员函数指针
来源:互联网 发布:c 游戏编程入门 编辑:程序博客网 时间:2024/06/10 14:25
整理自C++的的教科书。
类成员指针
不是真正的指针,它指向的是类的普通成员,而不是一个具体的地址,指向静态成员的指针反而是真正的指针。这是因为类的静态成员由所有实例共享,在编译期就可以确定具体的地址;而普通成员是由单个实例独享,很难在编译期确定普通成员地址。(不准确的讲,类成员指针更像一个地址偏移量,描述的是类成员在整个类内存布局的位置)
声明的基本格式:
类型名 类名::*指针名。
int Base::*b_int_p; //声明了指向类Base的int成员的指针b_int_p
类成员指针赋值 和普通指针赋值、初始化格式相同,但是解引用有自己特殊的符号, .* 和 ->*
示例:
class Base{public: int a; int b; static int c; // 静态成员};int Base::c = 10;int main(){ int Base::*pint = &Base::a; //声明类成员指针,并初始化指向成员a Base base; Base *pbase = &base; base.*pint = 2; //将实例base的成员a赋值2 pbase->*pint = 4; //将实例base的成员a赋值4 pint = &Base::b;//将pint指向Base类成员b return 0;}需要注意的是 ,不能将类成员指针指向类的静态成员;指向类静态成员的指针是普通指针
int *pp = &Base::c; //编译通过 //int Base::*pp = &Base::c;//编译失败
类成员指针可以指向子类的部分成员,这部分成员是从父类继承来的。
class A{public: int a;};class B : public A{public: int b;};int main(){ int A::*pa = &B::a; // 父类A的成员指针pa 指向了子类B的成员a return 0;}
类成员函数指针
类成员函数指针也和普通指针不同。一个指向成员函数的指针存储了一些实现自身的必要信息,如指向的成员函数是否为虚函数,需要到哪里找到合适的虚函数表等等。
类函数指针赋值 和普通指针赋值、初始化格式相同,但是解引用有自己特殊的符号, .* 和 ->*
声明、赋值、初始化和使用示例
class A{public: void funA(int m){} void Test(int){} static void static_fun(){}};int main(){ void (A::*pfun)(int) = &A::funA; //声明并初始化,指向funA pfun = &A::Test; //赋值,指向Test A a; A *pa = &a; (a.*pfun)(10); //注意,这里要用()将a.*pfun括起来,因为.*运算符的优先级比()低 (pa->*pfun)(10);//注意,这里要用()将pa->*pfun括起来,因为->*运算符的优先级比()低 return 0;}
需要注意的是 ,不能将类成员指针指向类的静态函数;指向类静态函数的指针是普通指针
void (*pp)() = &A::static_fun; //正确void (A::*pp)() = &A::static_fun; //错误
类函数指针可以指向子类的部分函数,这部分函数是从父类继承来的。(示例略)
类函数指针也遵从多态。如
class A{public: virtual void fun() { printf("class A"); }};class B : public A{public: void fun() { printf("class B"); }};int main(){ A *a = new B; void (A::*pfun)() = &A::fun; (a->*pfun)(); //真正执行的是B::fun() return 0;}//输出 class B
0 0
- 函数指针和类成员指针
- 函数指针和类成员指针
- 类成员指针和类成员函数指针
- 类成员指针和类成员函数指针
- 类的成员变量偏移指针和成员函数指针
- 类成员指针和成员函数指针(深入理解)
- 类的成员变量偏移指针和成员函数指针 .
- 类的数据成员指针和成员函数指针
- 类成员函数指针
- 类成员函数指针
- 类成员函数指针
- 类成员函数指针
- 类成员函数指针
- 类成员函数指针
- “类” 成员函数 指针
- 类成员函数指针
- 类成员函数指针
- 类成员函数指针
- android 监听事件的处理
- typedef struct和struct的区别
- wiki企业版confluence的PPT中文乱码问题
- Android 中Touch(触屏)事件传递机制
- 软件开发方法
- 类成员指针和类成员函数指针
- java Map排序(按key和按value)
- 没有路由器,也可以很好的畅游无线网络
- 非常有用的15个Linux 服务器监控命令
- mysql高可用探究(二)Lvs+Keepalived+Mysql单点写入主主同步高可用方案
- Flex 亮度、对比度、饱和度和色相的设置
- SoC
- 百度百科 BFS
- Mac下 git 终端的utf-8 字符显示