使用指向成员运算符的指针
use of pointer-to-member operators?
我遇到了以下代码,但无法理解以下概念的重要性。请帮忙。
#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;
}
指向成员的指针是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) };
}
请注意,我们是如何使用指向成员的指针仅引用类成员的,并且我们可以使用该指针从不同的对象中获得相同的relative类成员。
(相比之下,我们还可以形成一个指向实际对象成员的实际指针:int * p = &x.a;
。这是因为成员-int
实际上是一个整数。但我们不能对成员函数做任何类似的事情,因为成员函数不是函数(例如,您不能调用它们)。)
确保您理解类和对象之间的区别,这一点应该会变得非常清楚!
相关文章:
- C++ 带有函数指针的运算符优先级
- 是否允许编译器省略对指针的 &* 运算符的组合调用?
- 错误:表达式必须具有算术、无作用域枚举或带有运算符重载的指针类型
- 重载 ostream << 运算符,指针作为参数,导致输出上的内存地址
- 在一个指令中声明更多指针的运算符优先级
- 为什么在通过引用返回运算符分配时取消引用'this'指针?
- SFINAE - 检测类型 T 是指针、数组还是带有随机访问运算符的容器,以及给定的值类型
- c++:复制、删除和运算符=在原始指针映射中
- 除了调用全局删除运算符之外,删除一个void指针还能做什么呢
- 类重载运算符 '<' 插入指向该对象集的共享指针时不调用
- 使用继承的指针列表复制构造函数或重载运算符=
- delete运算符如何处理c中的指针
- 为指针重载运算符++
- 在分配指向数组内存地址的指针时,为什么不必使用地址运算符?
- 如何从模板类重载创建的指针对象上的运算符?
- 创建指针是否超过非数组指针的末尾,而不是从 C++17 中的一元运算符和未定义的行为派生?
- 为什么运算符"new"需要指针才能工作?
- C++运算符指针,乘法
- 运算符指针数组的新语法
- 重载运算符(指针)