class dog{
int name;
public:
dog();
void printname();
};
dog::dog(){
cout<<"dog构造"<<endl;
};
void dog::printname() {
cout<<"dog"<<endl;
}
int nihao(){
cout<<1<<endl;
return 0;
}
int main() {
int (*func)();//普通函数指针
func=nihao;
func();
dog dog1;
dog *dogptr = &dog1;
// cout<<&dog1.printname;//报错,不能通过实例化对象获取其成员函数地址
void (dog::*p)() = &dog::printname;//只能通过 &类名::函数名 的方式得到成员函数的函数指针,这个时候不涉及任何实例化的对象,注意这里的&**
(dog1.*p)();//通过实例化的对象(this指针)使用成员函数指针
(dogptr->*p)();//调用方式2
}
普通函数的函数名就是地址,而获取成员函数地址时,需要在前面加&
,这一点容易忘
之所以要这样调用是因为
仅仅有类成员函数的内存起始地址是不够的
还要解决多重继承、虚继承而带来的类实例地址的调整问题
所以类成员函数指针在调用的时候一定要传入类实例对象
普通函数指针可以获取类中静态成员函数,赋值和上面的&dog::printname
一致
原文链接: https://www.cnblogs.com/lxzbky/p/17066140.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;
也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/399861
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!