符合中小企业对网站设计、功能常规化式的企业展示型网站建设
本套餐主要针对企业品牌型网站、中高端设计、前端互动体验...
商城网站建设因基本功能的需求不同费用上面也有很大的差别...
手机微信网站开发、微信官网、微信商城网站...
这篇文章将为大家详细讲解有关C++ 指向类成员的指针是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
公司主营业务:成都网站制作、成都网站设计、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。创新互联公司是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。创新互联公司推出梁山免费做网站回馈大家。
指向类成员的指针总的来讲可以分为两大类四小类(指向数据成员还是成员函数,指向普通成员还是静态成员),下面一一做介绍:
一、指向类的普通成员的指针(非静态)
1、指向类成员函数的指针
简单的讲,指向类成员函数的指针与普通函数指针的区别在于,前者不仅要匹配函数的参数类型和个数以及返回值类型,还要匹配该函数指针所属的类类型。总结一下,比较以下几点:
a)参数类型和个数
b)返回值类型
c)所属的类类型(特别之处)
究其原因,是因为非静态的成员函数必须被绑定到一个类的对象或者指针上,才能得到被调用对象的this指针,然后才能调用指针所指的成员函数(我们知道,所有类的对象都有自己数据成员的拷贝,但是成员函数都是共用的,为了区分是谁调用了成员函数,就必须有this指针,this指针是隐式的添加到函数参数列表里去的)。
明白了这点,接下来就简单了。
声明:与普通函数作为区分,指向类的成员函数的指针只需要在指针前加上类类型即可,格式为:
typedef 返回值 (类名::*指针类型名)(参数列表);
赋值:只需要用类的成员函数地址赋值即可,格式为:
指针类型名 指针名 = &类名::成员函数名;
注意:这里的这个&符号是比较重要的:不加&,编译器会认为是在这里调用成员函数,所以需要给出参数列表,否则会报错;加了&,才认为是要获取函数指针。这是C++专门做了区别对待。
调用:调用方法也很简单,针对调用的对象是对象还是指针,分别用.*和->*进行调用,格式为:
(类对象.*指针名)(参数列表);
(类指针->*指针名)(参数列表);
注意:这里的前面一对括号是很重要的,因为()的优先级高于成员操作符指针的优先级。
下面举个简单的例子就一目了然了:
class A; typedef void (A::*NONSTATICFUNCPTR)(int); //typedef class A { public: void NonStaticFunc(int arg) { nonStaticMember = arg; cout<*funcPtr)(10); //通过指针调用 return 0; }
2、指向类数据成员的指针
成员函数搞懂了,数据成员也就easy了,只要判断以下两点是否一致即可:
a)数据成员类型
b)所属的类类型
另外,声明、赋值还有调用方法等这些是和前面类似的,再举个例子吧:
class A; typedef int (A::*NONSTATICDATAPTR); //typedef class A { public: A(int arg):nonStaticMember(arg){} int nonStaticMember; }; int main() { NONSTATICDATAPTR dataPtr= &A::nonStaticMember; A a(10); cout<*dataPtr; //通过指针引用 return 0; }
运行结果,当然是各自输出10和100啦。
二、指向类的静态成员的指针
类的静态成员和普通成员的区别在于,他们是不依赖于具体对象的,所有实例化的对象都共享同一个静态成员,所以静态成员也没有this指针的概念。
所以,指向类的静态成员的指针就是普通的指针。
看下面的例子就明白了:
typedef const int *STATICDATAPTR; typedef int (*STATICFUNCPTR)(); //跟普通函数指针是一样的 class A { public: static int StaticFunc() { return staticMember; }; static const int staticMember = 10; }; int main() { STATICDATAPTR dataPtr = &A::staticMember; STATICFUNCPTR funcPtr = &A::StaticFunc; cout<<*dataPtr; //直接解引用 cout<<(*funcPtr)(); return 0; }
最后注明一下,显然的,要使用(&类名::成员名)获取指向成员的指针,首先这个成员必须是对外可见的哦,即public的,不然是没有权限获取的^^。
关于“C++ 指向类成员的指针是什么”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。