函数指针以及成员函数指针_成员变量指针
来源:互联网 发布:wifi攻击软件 编辑:程序博客网 时间:2024/05/16 19:33
这篇是为了加深记忆所写。发现,很多知识若不经过反复的琢磨和动手实践,是很难记得住的。
1) 函数指针的初始化。
函数如下:
2 {
3 return str1.compare(str2);
4 }
函数的初始化有两种方式:
第一种,也是最普遍的方式:
第二种,是使用typedef定义函数类型,这种写法有助于对代码的理解:
2 CompareFunctionType CompareFunction = CompareString;
2) 函数指针赋值。
函数名可以理解为该类型函数的指针。当然,取地址操作符作用于函数名上也能产生指向该类型函数的指针。也就是说下面两种赋值都是可行的:
2 CompareFunctionType CompareFunction = &CompareString;
3) 函数调用。
无论是用函数名调用,还是用函数指针调用,还是用显式的指针符号调用,其写法是一样的:
2 CompareFunction("abc", "cba");
3 (*CompareFunction)("abc", "cba");
4) 函数指针的数组。
对于函数指针的数组,强烈建议使用typedef方式定义类型之后再使用,不然影响代码的阅读性,继续以以上例子为例:
2 int (*CompareFunctionArray[3])(const string&, const string&);
3 //with typedef
4 CompareFunctionType CompareFunctionTypeArray[3];
5) 函数指针用做函数返回值的类型。
到这一步,会发现typedef是多么的好用了。不然我是完全读不懂下面语句的意思的:
2 int (*func(int*, int))(const string&, const string&);
上面的声明,将func(int*, int)声明为一个函数,返回值为函数指针,函数类型为int (*)(const string&, const string&)。
多么的晦涩啊!
如果写成typedef就不用这么纠结了,足见typedef的作用:
6) 指向extern "C"函数的指针。
《C++ primer 3》中有指出,指向C函数的指针和指向C++函数的指针类型不同,但是现在的很多编译器都有语言扩展,认为这两种函数的指针具有相同的特性。
所以,我在vs 2010中做了尝试,结果证明是支持这种语言扩展的。
函数声明如下:
2 {
3 return str1.compare(str2);
4 }
5
6 int InsideFunctionCPlusPlus(const string& str1, const string& str2)
7 {
8 return str1.compare(str2);
9 }
函数指针的初始化和调用,允许赋值为指向C函数的指针:
另外还有一点,当extern "C"应用在一个声明上时,所有被它声明的函数都将受到影响。举个例子:
2 {
3 cout<<fc("abc", "cba")<<endl;;
4 }
这里的OutSideFunction和fc都将受到extern "C"的影响,但是vs2010编译器是支持一个指向C++函数的指针作为OutSideFunction的参数。如下:
2 {
3 OutSideFunction(InsideFunctionC);
4 OutSideFunction(InsideFunctionCPlusPlus);
5
6 return 0;
7 }
到此就差不多了。昨天看了一遍,今天又写博客温习了一遍,应该算是加深记忆了。傻笑一个。
前面曾写过一篇恼人的函数指针(一),总结了普通函数指针的声明、定义以及调用,还有函数指针数组,函数指针用作返回值等。但是作为C++的研读,我发现我漏掉了一个最重要的内容,就是指向类成员的指针,这里将做相应补充(相关代码测试环境为vs 2010)。
指向类成员的指针总的来讲可以分为两大类四小类(指向数据成员还是成员函数,指向普通成员还是静态成员),下面一一做介绍:
一、指向类的普通成员的指针(非静态)
1、指向类成员函数的指针
简单的讲,指向类成员函数的指针与普通函数指针的区别在于,前者不仅要匹配函数的参数类型和个数以及返回值类型,还要匹配该函数指针所属的类类型。总结一下,比较以下几点:
a)参数类型和个数
b)返回值类型
c)所属的类类型(特别之处)
究其原因,是因为非静态的成员函数必须被绑定到一个类的对象或者指针上,才能得到被调用对象的this指针,然后才能调用指针所指的成员函数(我们知道,所有类的对象都有自己数据成员的拷贝,但是成员函数都是共用的,为了区分是谁调用了成员函数,就必须有this指针,this指针是隐式的添加到函数参数列表里去的)。
明白了这点,接下来就简单了。
声明:与普通函数作为区分,指向类的成员函数的指针只需要在指针前加上类类型即可,格式为:
typedef 返回值 (类名::*指针类型名)(参数列表);
赋值:只需要用类的成员函数地址赋值即可,格式为:
指针类型名 指针名 = &类名::成员函数名;
注意:这里的这个&符号是比较重要的:不加&,编译器会认为是在这里调用成员函数,所以需要给出参数列表,否则会报错;加了&,才认为是要获取函数指针。这是C++专门做了区别对待。
调用:调用方法也很简单,针对调用的对象是对象还是指针,分别用.*和->*进行调用,格式为:
(类对象.*指针名)(参数列表);
(类指针->*指针名)(参数列表);
注意:这里的前面一对括号是很重要的,因为()的优先级高于成员操作符指针的优先级。
下面举个简单的例子就一目了然了:
1 class A; 2 typedef void (A::*NONSTATICFUNCPTR)(int); //typedef 3 4 class A 5 { 6 public: 7 void NonStaticFunc(int arg) 8 { 9 nonStaticMember = arg; 10 cout<<nonStaticMember<<endl;11 }12 private:13 int nonStaticMember;14 };15 16 int main()17 {18 NONSTATICFUNCPTR funcPtr= &A::NonStaticFunc;19 20 A a;21 (a.*funcPtr)(10); //通过对象调用22 23 A *aPtr = new A;24 (aPtr->*funcPtr)(10); //通过指针调用25 26 return 0;27 }
2、指向类数据成员的指针
成员函数搞懂了,数据成员也就easy了,只要判断以下两点是否一致即可:
a)数据成员类型
b)所属的类类型
另外,声明、赋值还有调用方法等这些是和前面类似的,再举个例子吧:
1 class A; 2 typedef int (A::*NONSTATICDATAPTR); //typedef 3 4 class A 5 { 6 public: 7 A(int arg):nonStaticMember(arg){} 8 int nonStaticMember; 9 };10 11 int main()12 {13 NONSTATICDATAPTR dataPtr= &A::nonStaticMember;14 15 A a(10);16 cout<<a.*dataPtr; //通过对象引用17 18 A *aPtr = new A(100);19 cout<<aPtr->*dataPtr; //通过指针引用20 21 return 0;22 }
运行结果,当然是各自输出10和100啦。
二、指向类的静态成员的指针
类的静态成员和普通成员的区别在于,他们是不依赖于具体对象的,所有实例化的对象都共享同一个静态成员,所以静态成员也没有this指针的概念。
所以,指向类的静态成员的指针就是普通的指针。
看下面的例子就明白了:
1 typedef const int *STATICDATAPTR; 2 typedef int (*STATICFUNCPTR)(); //跟普通函数指针是一样的 3 4 class A 5 { 6 public: 7 static int StaticFunc() { return staticMember; }; 8 static const int staticMember = 10; 9 };10 11 int main()12 {13 STATICDATAPTR dataPtr = &A::staticMember;14 STATICFUNCPTR funcPtr = &A::StaticFunc;15 16 cout<<*dataPtr; //直接解引用17 cout<<(*funcPtr)(); 18 19 return 0;20 }
最后注明一下,显然的,要使用(&类名::成员名)获取指向成员的指针,首先这个成员必须是对外可见的哦,即public的,不然是没有权限获取的^^。
写到此,简单总结一下就是:
1)静态的和普通的函数指针没啥区别;
2)非静态的加一个类局限一下即可。
不知道以后还会不会有函数指针相关的内容,先到此完结吧。
有错误欢迎指正,我会及时修改^^。
- 函数指针以及成员函数指针_成员变量指针
- 成员函数指针和成员变量指针
- 函数指针以及成员函数指针1
- 函数指针以及成员函数指针2
- C++之静态成员变量/函数以及成员指针
- 文章标题 C++成员变量以及成员函数指针
- c++函数指针 成员变量
- c++ 变量声明: 成员函数指针 成员变量指针
- 函数指针 成员函数指针
- 类的成员变量偏移指针和成员函数指针
- 类的成员变量偏移指针和成员函数指针 .
- C++成员变量指针和成员函数指针
- 数据指针、函数指针、成员函数指针
- 数据指针、函数指针、成员函数指针
- 成员函数指针【转贴】
- 类成员函数指针
- 成员函数指针数组
- 成员函数 指针
- Python导入txt数据到mysql的方法
- HDU3065病毒侵袭持续中AC自动机
- ADB server didn't ACK failed to start daemon *解决方案
- linux epoll 模型详解
- ActionBar兼容
- 函数指针以及成员函数指针_成员变量指针
- uva 10600 - ACM Contest and Blackout(次小生成树)
- jdk安装与卸载
- Merge Two Sorted Lists
- Java反射获取属性、方法、构造器
- HTTPS那些事(一)HTTPS原理
- ios网络编程01
- 简易版网页计算器
- 自定义spring schema简化与canal集成