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

          C++ 入門筆記(3)

          Posted on 2007-06-03 18:58 ZelluX 閱讀(373) 評論(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關鍵字。

          主站蜘蛛池模板: 莫力| 长汀县| 山阳县| 广东省| 鄱阳县| 托克逊县| 尖扎县| 云和县| 吉首市| 剑河县| 肃南| 前郭尔| 宁陵县| 疏勒县| 青铜峡市| 鸡泽县| 台北市| 翼城县| 霍林郭勒市| 长岛县| 乐清市| 九江市| 五河县| 连云港市| 东乡| 长顺县| 龙泉市| 禄劝| 永德县| 满洲里市| 溧阳市| 长武县| 五寨县| 江永县| 蒲城县| 开远市| 昌平区| 祁门县| 缙云县| 浦东新区| 太康县|