posts - 403, comments - 310, trackbacks - 0, articles - 7
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          C++ 入門筆記(3)

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

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

          主站蜘蛛池模板: 延川县| 深水埗区| 九龙城区| 雷州市| 皮山县| 奉化市| 兰考县| 霍邱县| 抚顺县| 扬州市| 马鞍山市| 固镇县| 汉中市| 徐闻县| 新源县| 高唐县| 中卫市| 千阳县| 霍林郭勒市| 平顶山市| 清苑县| 宁德市| 民丰县| 北京市| 同江市| 徐闻县| 元阳县| 泊头市| 天门市| 小金县| 常德市| 从江县| 雷山县| 四会市| 汉寿县| 太仓市| 张北县| 乐至县| 缙云县| 清原| 年辖:市辖区|