先看一个例子:
//统一的接口
include <iostream>
using namespace std;
struct Point{
intplus(doublex,doubley){returnx + y;}intminus(doublex,doubley){returnx - y;}intmul(doublex,doubley){returnx*y;}intdiv(doublex,doubley){returnx/y;}
};
int oper(Point & point, int (Point::*pfun)(double x, double y),
doublex, double y){return(point.*pfun)(x, y);
}
int main()
{
Point pt;int(Point::*pfun)(double,double);pfun = &Point::plus;cout<
}
再看一个例子:
//更加隐蔽的接口
include <iostream>
using namespace std;
class Widget{
public:
Widget(){ pf[0] = &Widget::f; pf[1] = &Widget::g; pf[2] = &Widget::h; pf[3] = &Widget::i;}intgetCount(){returncnt;}voidselect(intval,intsec){if(sec<0&& sec>3)return; (this->*pf[sec])(val);}
private:
voidf(intval){cout<<"void f()"<
};
int main()
{
Widget w;w.select(100,2);return0;
}
/指向静态成员的指针 /
//指向静态成员的指针的定义和使用与普通指针相同,在定义时无须和类相关联
//在使用时也无需和具体对象相关联
//声明 <数据类型>*<指针名>
//初始化 <数据类型>*<指针名> [=& <类名>::<静态数据成员>]
//解引用 (*<指向静态数据成员的指针>)
//声明 <数据类型>(*<指针名>)(<参数列表>)
//初始化 <数据类型>(*<指针名>)(<参数列表>) [=&<类名>::<静态成员函数>]
//解引用 (*<指向静态成员函数的指针>)(<参数列表>
//和普通函数指针,唯一的区别是: 在初始化时,&classname::member,要加上类名限定
include <iostream>
using namespace std;
class A{
public:
staticvoiddis();staticintdata;
};
void A::dis(){
cout<
}
int A::data = 100;
int main()
{
int*pa = &A::data;cout<<*pa<
}
/指向类成员函数的指针 /
//定义一个指向非静态成员函数的指针必须在三个方面与其指向的成员函数保持一致
//参数列表相同,返回类型要相同,所属的类型(类名)要相同
//由于类不是运行时存在的对象,因此,在使用这类指针时,需要首先指定类的一个对象
//然后,通过对象来引用指针所指的成员
//声明 <数据类型>(<类名>::*<指针名>)(<参数列表>)
//初始化 <数据类型>(<类名>::*<指针名>)(<参数列表>) [=&<类名>::<非静态成员函数>]
//解引用 (<类对象名>.*<指向非静态成员函数的指针>)(<参数列表>)
// (<类对象指针>->*<指向非静态成员函数的指针>)(<参数列表>)
include <iostream>
using namespace std;
class Student{
public:
Student(stringn,intnu): name(n), num(nu){}voiddis(){cout<<"name: "<
private:
stringname;intnum;
};
int main()
{
Student s("zhangtong",30);Student s2("lidan",26);Student *ps = new Student("zhaolanni",35);void (Student::*pf)() = &Student::dis;(s.*pf)();//name: zhangtongnum:30(s2.*pf)();//name: lidannum:26(ps->*pf)();//name: zhaolanninum:35return0;
}
/指向类数据成员的指针 /
//是类层面的指针,而不是对象层面的指针
//跟普通意义上的指针用法有很大的差别
//定义格式上,必须有类别限定 type className::*pointName
//初始化,也必须有类名限定&className::member
//并且定义的指针,只有通过具体的对象或对象指针才可以调用
//声明 <数据类型><类名>::*<指针名>
//初始化 <数据类型><类名>::*<指针名> [=& <类名>::<非静态数据成员>]
//解引用 <类对象名>.<指向非静态数据成员的指针> <类对象指针>-> <指向非静态数据成员的指针>
include <iostream>
using namespace std;
class Student{
public:
Student(stringn,intnu): name(n), num(nu){}stringname;intnum;
};
int main()
{
Students("zhangtong",29);Students2("lisa",43);stringStudent::*pn = &Student::name;cout<*pn<
}
看我主页简介免费C++学习资源,视频教程、职业规划、面试详解、学习路线、开发工具
每晚8点直播讲解C++编程技术。非常感谢大家的关注
网友评论