Posted on 2008-03-27 17:07
RichardHe 閱讀(156)
評論(1) 編輯 收藏 引用
(1)對const的用法過去不是很明白,不過今天看了<<effective c++>>里面有一個巧妙的理解
1 char *p = "hello"; // 非const指針,
2 // 非const數據
3 const char *p = "hello"; // 非const指針,
4 // const數據
5 char* const p = "hello"; // const指針,
6 // 非const數據
7 const char* const p = "hello"; // const指針,
8 // const數據
一般來說,你可以在頭腦里畫一條垂直線穿過指針聲明中的星號(*)位置,如果const出現在線的左邊,指針指向的數據為常量;如果const出現在線的右邊,指針本身為常量;如果const在線的兩邊都出現,二者都是常量。
(2)“通過值來傳遞一個對象”的具體含義是由這個對象的類的拷貝構造函數定義的。這使得傳值成為一種非常昂貴的操作。
如下面的代碼:
1 student returnstudent(student s) { return s; }
2 student plato; // plato(柏拉圖)在
3 // socrates(蘇格拉底)門下學習
4 returnstudent(plato); // 調用returnstudent
這個看起來無關痛癢的函數調用過程,其內部究竟發生了些什么呢?
簡單地說就是:首先,調用了student的拷貝構造函數用以將s初始化為plato;然后再次調用student的拷貝構造函數用以將函數返回值
對象初始化為s;接著,s的析構函數被調用;最后,returnstudent返回值對象的析構函數被調用。所以,這個什么也沒做的函數的成本是兩個
student的拷貝構造函數加上兩個student析構函數。
為避免這種潛在的昂貴的開銷,就不要通過值來傳遞對象,而要通過引用:
1 const student& returnstudent(const student& s)
2 { return s; }
這會非常高效:沒有構造函數或析構函數被調用,因為沒有新的對象被創建。
引用幾乎都是通過指針來實現的,所以通過引用傳遞對象實際上是傳遞指針。因此,如果是一個很小的對象——例如int——傳值實際上會比傳引用更高效。