1. 關(guān)于函數(shù)指針
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是以函數(shù)指針的形式傳遞給for_each的。感覺(jué)這種方法最清晰、直接。
Java似乎更多的是用接口來(lái)達(dá)到類似的效果的,比如Collections.sort(Comparable),通常通過(guò)匿名內(nèi)部類來(lái)進(jìn)行自定義元素的比較,從而排序。但是這在語(yǔ)義上已經(jīng)不是函數(shù)了,而是將被排序?qū)ο蠼忉尀閷?shí)現(xiàn)了Comparable接口的對(duì)象。
另外Java反射機(jī)制中也有Mehod方法,覺(jué)得也可以通過(guò)傳遞Method類,然后在sort方法中調(diào)用這個(gè)Method的invoke方法,這應(yīng)該更接近函數(shù)指針的語(yǔ)義。但沒(méi)看到過(guò)這樣的實(shí)例。
C#則引入了委托的概念,通過(guò)delegate關(guān)鍵字聲明該方法。多一個(gè)關(guān)鍵字感覺(jué)就是啰唆了點(diǎn)。 -,-
現(xiàn)在開(kāi)始對(duì)第一次在Thinking in Java中看到的Callback回調(diào)機(jī)制有了一點(diǎn)感覺(jué)。當(dāng)時(shí)看的時(shí)候很難理解。
看來(lái)在學(xué)習(xí)某一門語(yǔ)言的時(shí)候有一定其他語(yǔ)言的背景進(jìn)行比較,很容易加深理解。
2. 使用地址傳遞結(jié)構(gòu),減少開(kāi)銷
學(xué)C++最不適應(yīng)的就是指針的應(yīng)用,因?yàn)闆](méi)有C的基礎(chǔ),盡管高中競(jìng)賽用的是Pascal,也用指針實(shí)現(xiàn)了trie、圖的鏈?zhǔn)奖硎镜缺容^復(fù)雜的數(shù)據(jù)結(jié)構(gòu),但是也沒(méi)有像C++這樣指針穿插在整個(gè)程序中的,當(dāng)然C更多。
C++傳遞結(jié)構(gòu)時(shí)默認(rèn)是先復(fù)制一份拷貝,然后函數(shù)操作的是該拷貝,而不是Java中的傳遞引用(當(dāng)然Java沒(méi)有結(jié)構(gòu)這一類型)。
C++ Primer Plus中指出要
1) 調(diào)用函數(shù)時(shí)傳遞地址&myStruct
2) 形參聲明為指針MyStruct *
3) 訪問(wèn)成員使用操作符 ->
3. 將引用用于結(jié)構(gòu)
同樣,為了節(jié)省時(shí)空開(kāi)銷,在函數(shù)返回值時(shí)盡量使用引用。
const MyStruct & use(MyStruct & mystruct)
注意最好將返回的引用聲明為const,否則可以使用這樣的代碼:
use(myStruct).used = 10;
容易產(chǎn)生語(yǔ)義混亂。
但在某些時(shí)候必須去掉const關(guān)鍵字。