函數類型(FuncType)和函數指針(FuncPointer) ios
函數指針: 指向函數的的指針,和普通的指針無本質區別函數
函數類型: 由函數返回值類型/函數參數類型決定,和函數名稱無關指針
例如:code
對於函數: bool my_function(int a, const std::string& str)編譯器
函數類型(FuncType): bool(int, const std::string&)string
函數指針FuncPointer: bool (*FuncPointer)(int, const std::string&)io
函數類型和函數指針和函數參數編譯
(1) 函數形參: 函數類型不可做爲形參(可是通常編譯器會將函數類型形參自動轉爲函數指針),函數指針能夠做爲形參function
例如:class
void my_function2(FuncPointer fp) // OK
void my_function3(FuncType fn) ==編譯器轉爲==> void my_function3(FuncPointer fp)
(2) 函數做爲實參時,自動轉爲函數指針
以下示例:
#include <iostream> typedef void(*FuncPointer)(const std::string& str); typedef void(FuncType)(const std::string& str); void func(const std::string& str) { std::cout << __FUNCTION__ << "==> " << str << std::endl; } void functype_test(const std::string& str, FuncType ft) { ft(str); } void funcpointer_test(const std::string& str, FuncPointer fp) { fp(str); } int main(int argc, char *argv[]) { const std::string str1 = "test_function_type_as_function_pointer"; functype_test(str1, func); const std::string str2 = "test_function_as_function_pointer"; funcpointer_test(str2, func); return 0; }
函數類型和函數指針和函數返回值
FuncPointer my_function4() // 返回函數指針 OK
FuncType my_function5() // 返回函數類型 Error
函數類型和函數指針定義
(1) 形式1
typedef bool FuncType(int a, const std::string& str) // 函數類型
typedef bool *(FuncPointer)(int a, const std::string& str) // 函數指針
(2) 形式2
typedef decltype(my_function) FuncType // 函數類型
typedef decltype(my_function)* FuncPointer // 函數指針 = 函數類型*
(3) 形式3
using FuncType=bool(int, const std::string&) // 函數類型
using FuncPointer=bool(*)(int, const std::string&) // 函數指針