posts - 403, comments - 310, trackbacks - 0, articles - 7
            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          C++ 入門筆記(3)

          Posted on 2007-06-03 18:58 ZelluX 閱讀(373) 評(píng)論(0)  編輯  收藏 所屬分類: C/C++

          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)鍵字。

          主站蜘蛛池模板: 丰台区| 铁岭市| 满洲里市| 中阳县| 龙州县| 黑河市| 鄂托克前旗| 宁远县| 芮城县| 海安县| 遂溪县| 乌审旗| 新沂市| 上杭县| 武义县| 滁州市| 横峰县| 福安市| 阿拉善左旗| 隆昌县| 博罗县| 呼玛县| 江都市| 安平县| 龙胜| 隆回县| 南平市| 大田县| 中西区| 郧西县| 崇明县| 南江县| 双辽市| 阳东县| 邢台市| 土默特左旗| 壤塘县| 资源县| 子长县| 邢台县| 陵川县|