C++ Primer 5th笔记(chap 19 特殊工具与技术)成员函数指针
生活随笔
收集整理的這篇文章主要介紹了
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笔记(cha
- 下一篇: C++ Primer 5th笔记(cha