c++ - 出色的 C++ 项目 36

标签 c++ memory-management

作为类作业的一部分,我们正在阅读 Herb Sutter 的 Exceptional C++ 一书。

我对理解 typedef 实际在做什么和破译有疑问 它是如何构造的:第 36 项:

如果有人了解 typefef 的逻辑,这将是一个很大的帮助。

class B
{
public:
   virtual ~B();
   void operator delete (void*, size_t) throw();
   void operator delete[] (void*, size_t) throw();
   void f(void*, size_t) throw();
}
class D : public B
{
public:
   void operator delete (void*) throw();
   void operator delete[] (void*) throw();
};

typedef void (B::*PMF)(void*, size_t);
PMF p1 = &B::f;
PMF p2 = &B::operator delete;

由于 B 类(PMF)中没有指向成员函数的指针, 什么是 PMF,它是如何创建的?

void 是 typedef 的返回类型吗? (void* 和 size_t) 是 typedef 的参数吗?

谢谢

最佳答案

typedef 关键字为现有类型声明一个别名

例如

typedef int integral;
integral i = 1;

typedef void (B::*PMF)(void*, size_t); 行声明了一个类型的别名 PMF:函数指针 (这是一个指针指向 void size_t) 返回 void.

有关如何使用螺旋规则从复杂声明中解释类型的详细说明,请参阅此链接:The Clockwise/Spiral Rule

PMF 是该类型的别名。它可用于声明指向作为 B 成员且具有相同参数列表和返回类型的任何函数的指针。

PMF p1 = &B::f; // Declare p1 as a PMF and set it to point to address of B::f.
B b; // Create instance of B (needed as p1 points to a member function).
(b.*p1)(nullptr, 0); // Here p1 can be used as if it was a call to B::f.

关于c++ - 出色的 C++ 项目 36,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18038957/

相关文章:

c++ - 回调参数类型在继承类中不匹配

c++ - 链表中节点的字段未解析

c++ - 引用计数(不存储任何数据)

c++ - 如何使用 boost::serialization 序列化 TAO::unbouded_basic_string_sequence<T>?

ios - 持续检查对象引用计数的 iOS 和/或 Mac OS 系统进程是什么?

c++ - 堆上的内存是如何耗尽的?

c++ - 分配二维字符数组

c++ - 如何在 C++ 中包装 CFtpFileFind 示例?

c++ - boost 池单例 RequestedSize 设置

c++ - 将二进制文件读入堆栈而不是堆