我遇到过以下代码,但无法理解以下概念的重要性。请帮忙。
#include <iostream>
using namespace std;
class cl
{
public:
cl(int i) { val=i; }
int val;
int double_val() { return val+val; }
};
int main()
{
int cl::*data; // data member pointer
int (cl::*func)(); // function member pointer
cl ob1(1), ob2(2); // create objects
cl *p1, *p2;
p1 = &ob1; // access objects through a pointer
p2 = &ob2;
data = &cl::val; // get offset of val
func = &cl::double_val; // get offset of double_val()
cout << "Here are values: ";
cout << p1->*data << " " << p2->*data << "\n";
cout << "Here they are doubled: ";
cout << (p1->*func)() << " ";
cout << (p2->*func)() << "\n";
return 0;
}
答案 0 :(得分:4)
指向成员的指针是C ++中的一个特殊小工具,只告诉您有关类的哪个成员,而不涉及任何对象。您需要将指向成员的指针与对象实例相结合,以获得实际成员,无论是数据还是函数成员。
将指向成员的指针视为“抵消”。另外,请记住指向成员的指针不是指针!
我们可以重写您的代码以使其更清晰:
struct Foo
{
int a;
int b;
double f(int, int);
double g(int, int);
};
int main()
{
int Foo::*ptm = &Foo::a;
double (Foo::*ptmf)(int, int) = &Foo::f;
Foo x, y, z;
int numbers[] = { x.*ptm, y.*ptm, z.*ptm }; // array of Foo::a's
ptm = &Foo::b; // reseat the PTM
int more[] = { x.*ptm, y.*ptm, z.*ptm }; // array of Foo::b's
double yetmore[] = { (x.*ptmf)(1,2), (y.*ptmf)(1,2) };
ptmf = &Foo::g;
double evenmore[] = { (x.*ptmf)(1,2), (y.*ptmf)(1,2) };
}
注意我们如何使用指向成员的指针仅引用类成员,我们可以使用它来获取相同的相对类成员不同的对象。
(相比之下,我们也可以形成一个指向实际对象成员的真实指针:int * p = &x.a;
。那是因为成员 - int
实际上是一个整数。但是我们不能对成员函数做任何类似的事情,因为成员函数不是函数(例如你不能调用它们)。)
确保你理解类和对象之间的区别,这应该变得非常清楚!