C++拾遗--类成员指针
C++拾遗--类成员指针
前言
类成员的类型与一般类型不同,那么类成员的指针类型自然与一般类型的指针有所差别。
我们有必要来探讨下类成员指针的使用。
正文
类成员指针是指能够指向类的非静态成员的指针。它的类型包含了类类型和所指向的成员类型。一般而言。指针指向的是对象。而类成员指针指向的是类成员而非类对象。
须要指出,类成员指针不是可调用对象,要想通过类成员指针调用类成员。需结合类对象或类指针。静态类型成员属于类,类型与普通指针相似。
数据成员指针
一般的声明形式:
成员类型 classname::*p;
它的赋值形式:
p = &classname::类数据成员;
这里的取地址符&,是必须的。
#include <iostream>
using namespace std;
class Myclass
{
public:
int a;
const char c;
Myclass(int a, int c) :a(a), c(c)
{
}
};
int main(void)
{
int Myclass::*pa;
pa = &Myclass::a;
const char Myclass::*pc;
pc = &Myclass::c;
Myclass my(520, 'C'), *p = &my;
cout << my.*pa << endl;
cout << p->*pa << endl;
cout << my.*pc << endl;
cout << p->*pc << endl;
cin.get();
return 0;
}执行
在这个样例中,我们定义了两个成员指针pa和pc。当中pc的声明必须加上const,否则,稍后的赋值会发生类型不匹配的错误。我们还定义了类的对象和指针,它们分别通过成员指针訪问运算符.*和->*,对类成员指针进行訪问。
函数成员指针
和数据成员指针类似,它的声明相同得指定类类型和函数成员类型。
返回类型 (classname::*pfun)(參数类型列表);
它的赋值形式:
pfun = &classname::类函数成员;
#include <iostream>
using namespace std;
class Compute
{
public:
int add(int a, int b)
{
return a + b;
}
int sub(int a, int b) const
{
return a - b;
}
};
int main(void)
{
int (Compute::*pfun1)(int, int);
pfun1 = &Compute::add;
int (Compute::*pfun2)(int, int) const;
pfun2 = &Compute::sub;
Compute com, *p = &com;
cout << (com.*pfun1)(100, 10) << endl;
cout << (p->*pfun1)(100, 10) << endl;
cout << (com.*pfun2)(100, 10) << endl;
cout << (p->*pfun2)(100, 10) << endl;
cin.get();
return 0;
}执行
这个样例就不多解释了。仅仅说一句:訪问限定符仍然有效,可在类外訪问的数据和函数才干够使用类成员指针调用。
mem_fn
通过mem_fn对类函数成员指针进行包装,来返回一个可调用对象。使用时,包括头文件functional。
#include <iostream>
#include <functional>
using namespace std;
class Compute
{
public:
Compute(int a, int b) :a(a), b(b)
{
}
int add()
{
return a + b;
}
int sub() const
{
return a - b;
}
private:
int a;
int b;
};
int main(void)
{
Compute com(100, 10), *p = &com;
auto fun1 = mem_fn(&Compute::add);
cout << fun1(com) << endl;
cout << fun1(p) << endl;
auto fun2 = mem_fn(&Compute::sub);
cout << fun2(com) << endl;
cout << fun2(p) << endl;
cin.get();
return 0;
}执行
因为add方法是參数是void的。全部调用时,仅仅传递类对象fun(com)或指针fun(p)就可以。
若成员方法是带參数的,该怎样使用呢?看以下的代码:
#include <iostream>
#include <functional>
using namespace std;
class Compute
{
public:
int add(int a, int b)
{
return a + b;
}
int sub(int a, int b) const
{
return a - b;
}
};
int main(void)
{
Compute com, *p = &com;
auto fun1 = mem_fn(&Compute::add);
cout << fun1(com, 100, 10) << endl;
cout << fun1(p, 110, 10) << endl;
auto fun2 = mem_fn(&Compute::sub);
cout << fun2(com, 120, 10) << endl;
cout << fun2(p, 130, 10) << endl;
cin.get();
return 0;
}执行
这个演示样例显示了,若是带參数的。參数跟在类对象或类指针后面就可以。
mem_fn会依据传入的參数类型,自己主动选择调用.*或->*:
Compute com, *p = &com;
auto fun = mem_fn(&Compute::add);
fun(com);//传入对象,这一句会被解释成 auto padd = &Compute::add;(com.*padd)();
fun(p); //传入指针。这一句会被解释成 auto padd = &Compute::add;(p->*padd)();
bind
使用函数适配器bind,绑定类函数成员,返回可调用对象。
在bind函数绑定中,已经有了具体介绍。
本专栏文件夹
全部内容的文件夹

浙公网安备 33010602011771号