C++ Primer 5th笔记(chap 19 特殊工具与技术)成员函数指针

Posted thefist11

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ Primer 5th笔记(chap 19 特殊工具与技术)成员函数指针相关的知识,希望对你有一定的参考价值。

1.

使用 classname::*的形式声明一个指向成员函数的指针。

eg.

/ / pmf 是一个指针, 它可以指向 Screen 的某个常量成员函数
/ / 前提是该函数不接受任何实参, 并且返回一个 char
auto pmf = &Screen::get_cursor;
  • 指向成员函数的指针也需要指定目标函数的返回类型和形参列表
  • 如果成员函数是 const 成员 或者引用成员, 则我们必须将 const 限定符或引用限定符包含进来。

如果成员存在重载的问题, 则我们必须显式地声明函数类型以明确指出我们想要使用的是哪个函数

char (Screen::*pmf2) (Screen::pos, Screen::pos ) const;
pmf 2 = &Screen::get;

括号不能少,否则编译为

/ / 错误: 非成员函数 p 不能使用 const 限定符
char Screen::*p (Screen::pos, Screen::pos ) const;

在成员函数和指向该成员的指针之间不存在自动转换规则:

/ / pmf 指向一个 Screen 成员 , 该成员不接受任何实参且返回类型是 char
pmf = &Screen::get;/ / 必须显式地使用取地址运算符
pmf = Screen::get;/ / 错误: 在成员函数和指针之间不存在自动转换规则

2. 使用成员函数指针

.*或者->*运算符作用于指向成员函数的指针, 以调用类的成员函数:

Screen myScreen, *pScreen = &myScreen;

//通过pScreen 所指的对象调用 pmf 所指的函数
char c1 = (pScreen->*pmf) ( );

//通过 myScreen 对象将实参 0, 0 传给含有两个形参的 get 函教
char c2 = (myScreen.*pmf2 ) ( 0, 0 ) ;

2.1 使用成员指针的类型别名

/ / Action 是一种可以指向 Screen 成员函数的指针, 它接受两个 pos 实参, 返回一个 char
using Action = char (Screen::* ) (Screen::pos, Screen::pos ) const;
Action get = &Screen::get; / / get 指向 Screen 的 get 成员

可以将指向成员函数的指针作为某个函数的返回类型或形参类型。 其中, 指向成员的指针形参也可以拥有默认实参:

// action接受一个Screen的引用和一个指向Screen成员函数的指针
Screen& action(Screen&, Action = &Screen::get);
 
Screen myScreen;
// 等价调用
action(myScreen);                // 使用默认实参
action(myScreen, get);           // 使用我们之前定义的变量get
action(myScreen, &Screen::get);  // 显式地传入地址

2.2 成员指针函数表

常见的用法是将其存入一个函数表当中

class Screen {
public:
    // 其他接口和实现成员与之前一致
    // 这几个函数共同点: 不接受任何参数, 并且返回值是发生光标移动的Screen的引用
    Screen& home();        // 光标移动函数
    Screen& froward();
    Screen& back();
    Screen& up();
    Screen& down();
}
->

class Screen {
public:
    // Action是一个指针, 可以用任意一个光标移动函数对其赋值
    using Action = Screen& (Screen::*)();
    // 指定具体要移动的放共享
    enum Directions { HOME, FORWARD, BACK, UP, DOWN };
    Screen& move(Directions);
private:
    static Action Menu[];   // 函数表
};
 
Screen& Screen::move(Directions cm)
{
    // 运行this对象中索引值为cm的元素
    return (this->*Menu[cm])();  // Menu[cm]指向一个成员函数
}
 
Screen::Action Screen::Menu[] = {
    &Screen::home,
    &Screen::forward,
    &Screen::back,
    &Screen::up,
    &Screen::down,
};

Screen myScreen;
myScreen.move(Screen::HOME);   // 调用myScreen.home
myScreen.move(Screen::DOWN);   // 调用myScreen.down

以上是关于C++ Primer 5th笔记(chap 19 特殊工具与技术)成员函数指针的主要内容,如果未能解决你的问题,请参考以下文章

C++ Primer 5th笔记(chap 19 特殊工具与技术)malloc 函数与 free 函数

C++ Primer 5th笔记(chap 19 特殊工具与技术)控制内存分配

C++ Primer 5th笔记(chap 19 特殊工具与技术)使用 RTTI

C++ Primer 5th笔记(chap 19 特殊工具与技术)typeid

C++ Primer 5th笔记(chap 19 特殊工具与技术)定位 new 表达式

C++ Primer 5th笔记(chap 19 特殊工具与技术)成员函数指针