#include <iostream> using namespace std; typedef void (*fcnPtr)( int& ); // 《C++ Primer》,这个定义表明fcnPtr是一种指向函数的指针类型的名字,该指针是“指向 返回为void并带有一个int&的参数的函数 的指针” // 这种定义同义词的方法是很有用的,因为函数指针的类型常常非常冗长 // 示例函数 void print( int& data ) { cout << data << endl; } // 示例函数 void add_one( int& data ) { data++; } // 泛型容器,为了说明如何封装数据、又提供利用数据的途径 template<class T> class Container { public: Container(); Container( int length , T arr[] ); void for_each( void (*)( T& ) ); // 提供一个遍历数据的接口 private: int length; T* data; }; // 定义 template<class T> Container<T>::Container() { length = 0; }; // 定义 template<class T> Container<T>::Container( int length , T arr[] ) { this->length = length; data = new T[this->length]; for ( int i = 0 ; i < length ; i++ ) { data[i] = arr[i]; } } // !!! 有没有对比出什么? // 类内声明的形参是 void (*)( T& ) // 这里定义的是 void (*visit)( T& ) // // 联想ing... // // 以前,我们可以这样声明pop( int ),然后在实现的时候pop( int t ) // 所以,参数的类型是int,对象名为t // // 所以...,同理... // // 上面函数指针的类型是 void (*)( T& ) ,即: 返回类型 + (*) + 函数的参数列表 // 这个指针的名字是 visit template<class T> void Container<T>::for_each( void (*visit)( T& ) ) { for ( int i = 0 ; i < length ; i++ ) { visit( data[i] ); } } int main() { int arr[5] = { 1 , 2 , 3 , 4 , 5 }; Container<int> int_container( 5 , arr ); int_container.for_each( print ); // 《C++ Primer》,引用函数名但又没有调用该函数时,函数名将自动被解释为指向该函数的指针 fcnPtr p = 0; // 《C++ Primer》,函数指针只能通过同类型或函数指针或0指表达式进行初始化或赋值 p = add_one; // 陈志鹏,上面的同类型是指返回类型和形参列表相同,所以你也可以 p = print int_container.for_each( p ); // 玩啊,调用add_one int_container.for_each( print ); // 玩啊,调用print继续输出 return 0; } // 谢谢! ALL IS OVER!