#include <iostream><br />using namespace std;<br />typedef void (*fcnPtr)( int& ); // 《C++ Primer》,這個定義表明fcnPtr是一種指向函數的指標類型的名字,該指標是“指向 返回為void並帶有一個int&的參數的函數 的指標”<br />// 這種定義同義字的方法是很有用的,因為函數指標的類型常常非常冗長<br />// 樣本函數<br />void print( int& data )<br />{<br />cout << data << endl;<br />}<br />// 樣本函數<br />void add_one( int& data )<br />{<br />data++;<br />}<br />// 泛型容器,為了說明如何封裝資料、又提供利用資料的途徑<br />template<class T><br />class Container<br />{<br />public:<br />Container();<br />Container( int length , T arr[] );<br />void for_each( void (*)( T& ) );// 提供一個遍曆資料的介面<br />private:<br />int length;<br />T* data;<br />};<br />// 定義<br />template<class T><br />Container<T>::Container()<br />{<br />length = 0;<br />};<br />// 定義<br />template<class T><br />Container<T>::Container( int length , T arr[] )<br />{<br />this->length = length;<br />data = new T[this->length];<br />for ( int i = 0 ; i < length ; i++ )<br />{<br />data[i] = arr[i];<br />}<br />}<br />// !!! 有沒有對比出什嗎?<br />// 類內聲明的形參是 void (*)( T& )<br />// 這裡定義的是 void (*visit)( T& )<br />//<br />// 聯想ing...<br />//<br />// 以前,我們可以這樣聲明pop( int ),然後在實現的時候pop( int t )<br />// 所以,參數的類型是int,對象名為t<br />//<br />// 所以...,同理...<br />//<br />// 上面函數指標的類型是 void (*)( T& ) ,即: 傳回型別 + (*) + 函數的參數列表<br />// 這個指標的名字是 visit<br />template<class T><br />void Container<T>::for_each( void (*visit)( T& ) )<br />{<br />for ( int i = 0 ; i < length ; i++ )<br />{<br />visit( data[i] );<br />}<br />}<br />int main()<br />{<br />int arr[5] = { 1 , 2 , 3 , 4 , 5 };<br />Container<int> int_container( 5 , arr );<br />int_container.for_each( print ); // 《C++ Primer》,引用函數名但又沒有調用該函數時,函數名將自動被解釋為指向該函數的指標<br />fcnPtr p = 0;// 《C++ Primer》,函數指標只能通過同類型或函數指標或0指運算式進行初始化或賦值<br />p = add_one; // 陳志鵬,上面的同類型是指傳回型別和形參列表相同,所以你也可以 p = print<br />int_container.for_each( p );// 玩啊,調用add_one<br />int_container.for_each( print ); // 玩啊,調用print繼續輸出<br />return 0;<br />}<br />// 謝謝!<br />
ALL IS OVER!