指向类成员的指针
Pointer to a member of class
在我的类中,如果我想指向类的一个成员,
struct S
{
static int get();
int do_something();
int x;
};
我知道,
int (*p)() = S::get;
不幸的是,这不适用于非静态成员
int (*p)() = S::do_something; // error
既然,静态成员函数是一个普通函数,我在下面引用了一句话,说非静态成员函数也是一个普通的函数,为什么它不起作用呢?这是什么意思?
(9.2/10([注意:非静态成员函数的类型是普通的函数类型,而非静态数据成员的类型是普通的对象类型。没有特殊的成员函数类型或数据成员类型。]
非静态成员函数是而不是普通函数。您无法形成指向它们的自由指针。
引用非静态成员函数的唯一允许方式是通过实例指针/引用和指向成员函数的指针的对:
S * p = &theobject;
int (S::*ptmf)() = &S::do_something;
return (p->*ptmf)();
与成员对象(你可以很好地形成一个自由指针,例如&theobject.x
(不同,成员函数更复杂,因为你需要考虑虚拟函数:如果S
是一个多态基类,p
是一个指向基类的指针,do_something()
是虚拟的,那么上面的例子应该执行正确类型的调度。一个简单的自由函数指针无法做到这一点。
(此外,标准没有指定成员函数的每个底层实现是如何实现的,所以这个细节永远不会向用户公开。通常它会是类似int S_mangled_name_do_something(S *);
的东西,但没有指定。(
以下是我关于这个问题的一些相关答案:#1,#2。
函数的类型是普通的,而不是函数指针的类型。指向非静态成员函数的指针必须这样声明:
typedef int (S::*p)() ptr_to_member_of_s;
int (S::*p)() = S::do_something;
非静态成员函数是一个普通函数,除了有一个不可见的参数this。
相关文章:
- 如果基类包含双指针成员,则派生类的构造函数
- C++正确的指针成员初始化
- 是否可以使用智能指针成员设置具有另一个结构的结构?
- 为什么 operator() 处的指针成员不起作用?
- 更改队列指针成员的值需要在 C++ 中出现奇怪的错误
- 如何从另一个嵌套类中调用某个封闭类的嵌套类的函数指针成员的值?
- 结构对象的指针成员在传递给函数时被修改
- 参数的混合值,当我调用指针成员函数时
- 如何正确使用结构的共享指针成员?
- C++:私有类指针成员返回未定义的值
- 在函数中传递带有指针成员的结构是浅拷贝或深拷贝在 C 中
- 包含指针成员的嵌套结构
- 在 c++ 中,为什么 -> 被称为二进制中缀指针成员访问运算符?
- C++ 类指针成员行为奇怪(错误)
- 常量结构的指针成员
- 在类C++指针成员中
- 指针成员未在复制构造函数中初始化
- C++移动拥有指针成员的构造函数
- C++ 包含唯一指针成员变量的类的赋值运算符
- 如何使用 QPoint 指针成员对类进行排队和取消排队