类成员指针
1.成员指针式可以指向类的非静态成员的指针。类的静态成员不属于任何对象,因此无需特殊的指向静态成员的指针。指向静态成员的指针的普通指针没有任何区别。
2.当初始化一个类成员指针时,我们令其指向类的成员,但不指定代成员所属的对象,直到使用到成员指针时,才提供所属的对象。
3.数据成员指针
例:class screen{
public:typedef std::string::size_type pos;
char get_cursor() const {return const[curse];};
char get() const;
char get(pos ht, pos wd) const;
private:
std::string contents;
pos cursor;
pos height , wight;
};
(1)const string screen::*pdata;//声明,一个指向screen类的const string 成员的指针;
(2)pdata=&screen::contents;//初始换
(3)使用数据成员指针
当我们初始化一个成员指针或为成员指针赋值时,该指针别并没有指向任何数据。成员指针指定了成员而非所属的对象,只有当解引用成员指针时我们才能提供对象的信息。
screen myscreen;
*pscreen=&myscreen;
auto s=myscreen.(*pdata);或s=pacreen->(*pdata);
(4).返回成员指针函数
常规的访问控制规则对成员指针同样有效,public,private,protected。如果对于某个类,我们希望访问他的私有成员,最好定义一个函数令其返回值是指向成员的指针。
4.成员函数指针
auto pmf=&screen::get_cursor;
(1)重载问题:
char (screen::*pmf)(screen::pos,screen::pos)const;//函数指针声明
pmf=&screen::get;
(2)和普通函数不同,在成员函数和指向成员函数的指针之间不存在自动转换规则:
pmf=&screen::get;//正确
pmf=screen::get;//错误
(3)使用成员函数指针
screen myscreen;
*pscreen=&myscre;
char c1=(pscreen->*pmf)(0,0 );
char c2=(myscreen.(*pmf)) (0,0);
5.将成员函数用作可调用对象
(1)与普通的函数指针不同,成员指针不是一个可调用对象。
例:
auto fp=&string::empty;
find_if(svec.begin(), svec.end(), fp);//错误:要想通过成员指针调用函数必须使用->*y运算符。
(2)使用function生成一个可调用对象
function<bool (const string&,const string&)>fcn=&string::empty;
find_if(svev.begin(),svec.end(),fcn);
(3)使用mem_fn生成一个可调用对象
和function一样,mem_fn也定义在functional头文件中,并且可以从成员指针生成一个可调用对象;和function不同,mem_fn可以根据成员指针的类型推断可调用对象的类型,而无需用户显示的指定。
find_if(svec.begin(),svec.end(),mem_fn(&string::empty));
mem_fn生成的可调用对象可以通过对象调用,也可以通过指针调用:
auto f=mem_fn(&string::empty);
f(*svec.begin());//对象调用
f(&svec[0]);//指针调用
(4)使用bind生成一个可调用对象
auto it=find_if(svec.begin(),svec.end(),bind(&string::empty,_1));
和function类似的地方是,当我们使用bind时,必须将函数中用于表示对象的隐式形参转换成显示的。和mem_fn类似生成的可调用对象可以通过对象调用,也可以通过指针调用:
auto f=bind(&string::empty,_1);
f(*svec.begin());//对象调用
f(&svec[0]);//指针调用