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