Thinkcpp 学习笔记 c11 成员函数指针
2015-01-30 10:31
162 查看
指向函数的指针定义:
int (*fp) (float);
(*fp) 的圆括号使得编译器正确判断定义,没有圆括号,这个表达式就是一个返回 int *的函数 int * fp (float)
同样,成员函数指针也需要圆括号:
成员指针可以在创建或者其他时候被初始化。
成员函数指针的调用必须用 .* 或者 ->* 的方式。类似 int re = fp(9.0) 是不允许的。必须是 : int re = (pSObj->*fp)(9.0) 注意:这里的括号是必须的。
上面是一个动态改变指针内容的例子。
为了更加简化用户使用,可以使用成员指针作为内部执行机制的一部分
总结:
记住这种数组写法: void (Widget::*fptr[cnt]) (int)
在内部定义时不要省略类名: fptr[0] = &Widget::f
在内部调用方法时不要省略对象this或者忘记括号 : (this->*fptr[0])(args)
int (*fp) (float);
(*fp) 的圆括号使得编译器正确判断定义,没有圆括号,这个表达式就是一个返回 int *的函数 int * fp (float)
同样,成员函数指针也需要圆括号:
class Simpe{ public: int f(float) const{return 1;} }; int (Simple::*fp)(float) const; int (Simple::*fp2)(float)const = &Simple::f; int main(){ fp = &Simple::f; }
成员指针可以在创建或者其他时候被初始化。
成员函数指针的调用必须用 .* 或者 ->* 的方式。类似 int re = fp(9.0) 是不允许的。必须是 : int re = (pSObj->*fp)(9.0) 注意:这里的括号是必须的。
1 #include <iostream> 2 using namespace std; 3 4 class Widget{ 5 public: 6 void f(int)const{cout<<"Widget::f()\n";} 7 void g(int)const{cout<<"Widget::g()\n";} 8 void h(int)const{cout<<"Widget::h()\n";} 9 }; 10 11 int main(){ 12 Widget w,*wp = &w; 13 w.f(100); 14 15 void (Widget::*fp)(int) const; 16 fp = &Widget::f; 17 (wp->*fp)(1); 18 fp = &Widget::g; 19 (wp->*fp)(1); 20 return 0; 21 }
上面是一个动态改变指针内容的例子。
为了更加简化用户使用,可以使用成员指针作为内部执行机制的一部分
1 #include <iostream> 2 using namespace std; 3 class Widget{ 4 void f(int)const {cout<<"Widget::f()\n";} 5 void g(int)const {cout<<"Widget::g()\n";} 6 void h(int)const {cout<<"Widget::h()\n";} 7 enum{cnt = 3}; 8 void (Widget::*fptr[cnt])(int) const; 9 public: 10 Widget(){ 11 //注意这里需要写完整的类名,并不因为在内部而可以省略 12 fptr[0] = &Widget::f; 13 fptr[1] = &Widget::g; 14 fptr[2] = &Widget::h; 15 } 16 void select(int i,int arg){ 17 if(i > 0 || i < cnt) 18 (this->*fptr[i])(arg);//注意这里的括号和this都是不可少的 19 } 20 int count(){return cnt;} 21 }; 22 23 int main(){ 24 Widget w; 25 for(int i=0;i<w.count();i++) 26 w.select(i,i*10); 27 28 return 0; 29 }
总结:
记住这种数组写法: void (Widget::*fptr[cnt]) (int)
在内部定义时不要省略类名: fptr[0] = &Widget::f
在内部调用方法时不要省略对象this或者忘记括号 : (this->*fptr[0])(args)
相关文章推荐
- Thinkcpp学习笔记 c11 成员指针 Pointer to member
- C++学习笔记(3)——成员变量、成员函数的指针
- C++ 学习笔记(19)new/delete表达式、定位new、typeid、dynamic_cast、type_info、枚举类型、成员函数指针、union、位域、volatile限定符、链接指示
- C++学习笔记(13)——利用对象、引用、指针调用虚函数
- C/C++学习笔记:指向类成员变量的指针
- 韩顺平_轻松搞定网页设计(html+css+javascript)_第32讲_构造函数_成员函数详解_学习笔记_源代码图解_PPT文档整理
- C语言学习笔记之成员数组和指针
- 2013-7-10学习笔记[字符串操作,指向函数的指针]
- C#2005 .NET3.0高级编程学习笔记————类的函数成员(构造函数,只读字段)
- C++学习笔记二十二-类成员的指针
- C++学习笔记之指向函数的指针
- 韩顺平_轻松搞定网页设计(html+css+javascript)_第33讲_Object类_闭包_成员函数再说明_聪明的猪小练习_学习笔记_源代码图解_PPT文档整理
- C++函数指针 学习笔记
- C++笔记(一)const与define,指针,引用,函数,类成员
- C与指针学习笔记——命令行参数和神秘函数
- what's in string? c语言string类函数实现汇总 都是学习使用指针的好例子啊(算是读书摘抄和笔记吧)
- C++成员函数指针的应用(学习收录)
- 【菜鸟C++学习笔记】11.内联函数与const成员函数
- C++数据的封装和类体内定义成员函数的学习笔记
- 2013-7-10学习笔记[字符串操作,指向函数的指针]