1. 關于函數指針
The C++ Programming Language上的一段示例代碼:
map<string, int> histogram;
void record(const string& s)
{
histogram[s]++;
}
void print(const pair<const string, int>& r)
{
cout << r.first << ' ' << r.second << '\n\;
}
int main()
{
istream_iterator<string> ii(cin);
istream_iterator<string> eos;
for_each(ii, eos, record);
for_each(histogram.begin(), histogram.end(), print);
}
其中record和print是以函數指針的形式傳遞給for_each的。感覺這種方法最清晰、直接。
Java似乎更多的是用接口來達到類似的效果的,比如Collections.sort(Comparable),通常通過匿名內部類來進行自定義元素的比較,從而排序。但是這在語義上已經不是函數了,而是將被排序對象解釋為實現了Comparable接口的對象。
另外Java反射機制中也有Mehod方法,覺得也可以通過傳遞Method類,然后在sort方法中調用這個Method的invoke方法,這應該更接近函數指針的語義。但沒看到過這樣的實例。
C#則引入了委托的概念,通過delegate關鍵字聲明該方法。多一個關鍵字感覺就是啰唆了點。 -,-
現在開始對第一次在Thinking in Java中看到的Callback回調機制有了一點感覺。當時看的時候很難理解。
看來在學習某一門語言的時候有一定其他語言的背景進行比較,很容易加深理解。
2. 使用地址傳遞結構,減少開銷
學C++最不適應的就是指針的應用,因為沒有C的基礎,盡管高中競賽用的是Pascal,也用指針實現了trie、圖的鏈式表示等比較復雜的數據結構,但是也沒有像C++這樣指針穿插在整個程序中的,當然C更多。
C++傳遞結構時默認是先復制一份拷貝,然后函數操作的是該拷貝,而不是Java中的傳遞引用(當然Java沒有結構這一類型)。
C++ Primer Plus中指出要
1) 調用函數時傳遞地址&myStruct
2) 形參聲明為指針MyStruct *
3) 訪問成員使用操作符 ->
3. 將引用用于結構
同樣,為了節省時空開銷,在函數返回值時盡量使用引用。
const MyStruct & use(MyStruct & mystruct)
注意最好將返回的引用聲明為const,否則可以使用這樣的代碼:
use(myStruct).used = 10;
容易產生語義混亂。
但在某些時候必須去掉const關鍵字。