IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++ Primer 5th笔记(chap 19 特殊工具与技术)成员函数指针 -> 正文阅读

[C++知识库]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++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-10-15 11:36:23  更:2021-10-15 11:36:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 2:44:18-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码