#include<iostream>
#include "string"
using namespace std;
/*
size_t count_calls()
{
?static size_t ctr = 0;
?return ++ctr;
}
*/
//不可以間隔省,不可以向后省,具體自己以編譯器的角度理解
/*
string screenInit(string::size_type height = 24,
????? string::size_type width = 80,
????? char background = ' ')
{
?return "";
}
*/
bool lengthCompare(const string &str1, const string &str2)//聲明一個函數
{
?if(str1.length() >= str2.length())
??return true;
?else
??return false;
}
void useBigger(const string &, const string &,
????? bool(const string &, const string &));//將函數指針作為參數
void useBigger(const string &, const string &,
????? bool (*)(const string &, const string &));//也可以這樣傳遞函數指針。
int (*ff(int))(int *, int);//返回指向函數的指針,需要從里往外理解
//很難理解大致為 有一個ff(int)函數,他帶有(int *, int)的參數,返回一個int
//可使用typedef簡化為
typedef int (*FF)(int *, int)
FF ff(int)
//真雞巴復雜
int main()
{
/*?
?typedef bool (*cmpFcn)(const string &, const string &); //只要函數類型相同皆可
?//所謂的函數類型,是指函數參數及其類型、個數、順序等,還有返回值
?cmpFcn pf1 = 0;
?cmpFcn pf2 = lengthCompare;
?pf2("111","2222");//直接引用函數名等效于在函數名上應用取地址操作符
?pf1 = pf2;
?pf1("2222","111");//不需要使用解引用操作符*,直接通過指針調用函數。
*/?
/*
?for(size_t i = 0;i != 100; ++i)
??cout<<count_calls()<<endl;
?return 0;
*/
?
return 0;
}
?
最后加幾點注意:
1.? 千萬不要返回局部對象的引用,因為局部對象已被回收,所以引用將會變成空引用,而返回對象執行的是值拷貝,也就是重新生成了一個對象。
2. 如果不希望引用返回的值被修改,返回引用請聲明為const,同理形參也是一樣,如果不希望被修改請設為const。
3. 千萬不要返回局部對象的引用,基本和引用相同,方法返回后局部對象被釋放,所以指針為垂懸指針。
4. 默認實參是通過給形參表中提供明確的初始值來指定的。在函數聲明中指定,而且在同一個文件中只能為一個函數指定一次。