1. 程式人生 > >在C++中是否應該使用指標,何時使用指標

在C++中是否應該使用指標,何時使用指標

C++中,除了多型情形外,最好避免指標(個人建議),下面是各種情形的替代方式,簡單又高效:
1、指標作為函式形參,用引用&代替
比如某個類的拷貝函式 bool classA_copy(classA *s1, const classA *s2);
        可寫作   bool classA_copy(classA &s1, const classA &s2);
這樣在函式實現時書寫更方便(反正我不習慣“->”)。
2、指標動態申請單個物件,用auto_ptr代替
常規的方式:classA *p;   p = new classA(); ..... delete p;
要記住一定要寫delete,不然會記憶體洩漏,如果這個指標p要反覆申請新的變數,那麼在申請之前也一定要delete一次。那麼,程式可能要修改成這樣:


         classA *p=NULL; //一定要初始化
         if(p)   delete p;  p = new classA(); //申請之前要檢測是否需要釋放
         if(p)   delete p; //在程式結束時,還要判斷是否釋放記憶體。
這樣就有點讓人寫的不爽了,其實,用auto_ptr更簡單:
auto_ptr<classA> p; //變數宣告
p.reset(new classA()); //申請新的classA變數,會自動釋放舊的classA變數(如果有的話)
//在函式結束時,auto_ptr會自動釋放記憶體。
3、指標動態申請一維陣列,用vector代替
指標用於申請單個變數已經比較麻煩了,申請多個變數時更麻煩,相信大家都有同感。

上面的auto_ptr方式只能用於申請單個變數,如果多個變數,就用vector代替吧。
關於vector的用法請查詢相關C++教程。
4、指標動態申請多維陣列,用boost::MultiArray代替
boost是C++的準標準庫,裡邊實現了相當多的精巧技術,值得一看。MultiArray實現的是多維陣列的功能。
當然,用vector<vector<classA>>來實現也是可以的,稍稍麻煩點而已。
5、函式指標,用boost::function代替
使用函式指標一般用來推遲一個呼叫或做一個回撥。boost::function可以代替函式指標,允許使用者在目標的實現上擁有更大的彈性。

如果需要多個回撥,需考慮boost::signals,它提供了更強大的可控功能。
6、指標容器,用boost::pointer_container 
熟悉stl標準演算法的人都知道,vector、list、map等標準容器的元素都是深拷貝的。當元素複製的代價較大時,就應該考慮指標容器;此外,某些類是沒有複製函式的(比如MFC的CSocket類),想用容器來管理多個元素,也應該使用指標容器。
指標容器,就是指容器中儲存的是指向元素的指標。當然,也可以用vector<(classA *>來實現,但是要記住及時的刪除記憶體,類似情形2。
boost::pointer_container實現了指標容器的功能,和stl容器的用法十分相似,還能夠自動管理記憶體。