C++ 类成员指针

来源:互联网 发布:身份证识别网络阅读器 编辑:程序博客网 时间:2024/06/05 10:26

类成员指针

1.成员指针式可以指向类的非静态成员的指针。类的静态成员不属于任何对象,因此无需特殊的指向静态成员的指针。指向静态成员的指针的普通指针没有任何区别。

2.当初始化一个类成员指针时,我们令其指向类的成员,但不指定代成员所属的对象,直到使用到成员指针时,才提供所属的对象。

 

 

3.数据成员指针

例:class screen{

publictypedef 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).返回成员指针函数

常规的访问控制规则对成员指针同样有效,publicprivateprotected。如果对于某个类,我们希望访问他的私有成员,最好定义一个函数令其返回值是指向成员的指针。

 

 

4.成员函数指针

auto pmf=&screen::get_cursor;

(1)重载问题:

char screen::*pmf)(screen::posscreen::posconst//函数指针声明

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_ifsvec.begin(),svec.end(),bind(&string::empty,_1);

function类似的地方是,当我们使用bind时,必须将函数中用于表示对象的隐式形参转换成显示的。和mem_fn类似生成的可调用对象可以通过对象调用,也可以通过指针调用:

auto f=bind&string::empty_1;

f*svec.begin();//对象调用

f(&svec[0]);//指针调用




0 0
原创粉丝点击