引用和指針非常相似,但也有區別。指針變量的內容是一個地址,而引用產生變量的別名。
在例中,*ptr是引用num的另一種方法。對*ptr的任何賦值,也會影響到num的值,反之亦然,這一點和引用是相似:的。.但是在引用中,不需要*操作符。由於*ptr是一個常量指針,一旦被初始化,它就不能再指向另外一個整數了。
對於指針來說,隻要使用操作符,就可以區分指針本身和它所指向的變量。例如,ptrS指針,而*ptr則為它所指向的整數。對引用是不用*操作符的。所以,我們僅能操縱被引用的變量,而不能操縱引用本身。
二、引用參數
在C語言中,將變量作為參數傳遞給函數有兩種方法:
1.傳遞變量自身:此種情況下,函數獲得變量的一份拷貝,即在棧上生成該變量一份新的拷貝。對於大型的結構來說,這種方法不太適用。因為它的傳遞速度較慢。
2.傳遞變量的指針:此種情況下,函數僅得到變量的地址,利用這個地址就可訪問主調函數的相應變量。對於大型的結構來說,這種方法更適用。因為它的傳遞速度較快。
在C++中,除了上述兩種方法外,還有第三種途徑:即傳遞對變量的引用。此種情況下,被調函數接受的是主調者中相應變量的一個別名。
當將一個引用作為參數傳遞時,編譯器實際上傳遞了調用者中相應變量的地址。因此,傳遞引用的效率與傳遞指針的效率一樣高。尤其是在傳遞大型結構時,此種方法更有效。此外,傳遞對某個變量的引用與傳遞變量本身是完全相同的。在函數調用語句中,無需使用&字符。在函數中使用參數,也無需使用。當將某個引用作為參數傳遞時,對該參數的所有修改實際上都是對調用者中的相應變量進行的。這個特點是非常重要的。所以在編寫參數傳遞的函數時,應遵循下麵原則:
1.如果傳遞的是基本數據類型(如:字符和整數等),參數按值傳遞比較有效。
2.如果傳遞的是較大的參數,並且在函數中要改變參數,可選用指針來傳遞。
3.如果傳遞的是較大的參數,而在函數中不需要改變參數,可采用對常量的引用來傳遞。
三、返回引用
可以使用引用作為函數的返回值。例如:
可見,當mim()函數用在賦值號的右端時,它隻是一個普通的賦值操作。把返回的引用變量的值賦給號左邊的變量。
而當num()函數出現在賦值號的左端時,如:num()=5;
由於mim()函數返回的是對mymun變量的引用,所以上麵賦值語句的作用是把5賦給變量mynum。
在構造C++類時會大量地用到引用。有關引用要記住以下幾點:
1.引用是實際變量的別名。
2.引用必須被初始化,且不能被修改。
3.當向函數傳遞用戶定義的數據類型及從函數中返回值時,使用引用是較方便的。
有時,引用聲明容易與取變量地址的操作相混淆,因為它們的形式都是“&標識符”。為了區別&的這兩種用法,記住下麵的兩條原則:
1.當“&標識符”前有某個類型名(如int或char)時,&意即對該類型的“引用”。這種形式的僅出現於聲明中。如聲明引用變量的類型,參數的類型,或函數的返回類型。
2.當“&標識符”前沒有類型名時,&表示變量的“地址”。當向函數傳遞參數或為指針賦值時,常出現這種形式。
4.13結構
在c語言中,我們經常用結構數據類型來表示一組用戶定義的數據,如可以利用結構設計一種表示一個點的坐標的數據類型。
在c語言中,結構隻能有數據而不能有函數,因此當我們需要一個輸出點的坐標的函數時,必須在結構外定義。但事實上該函數應該是屬於該結構的一個部分,上例中的解決方法雖然可以得到結果,但在整個數據的集成上有缺陷。在C++中,允許在結構數據類型中加人函數成為其中一部分。下麵讓我們修改一下上麵的例子。
C++的結構與第4章所要討論的類數據類型(class)有著密切的關係。事實上,它便是類數據類型的一個特例(請參閱第5章)。
4.14枚舉類型
枚舉是用戶自定義的一種數據類型。用戶通過枚舉一個類型的值域來定義一個數據類型。值域是通過在枚舉說明時所指定的一組文字童(又稱內枚舉常量)來指定的。
其中“標識符”標識了新定義的枚舉類型。若括號內的成份定義了一些文字量,則這些文字量就是這個枚舉類型的對象值的集合。
在Visual C++中,枚舉類型有下麵的特點:
1.與C語言不同,在Visual C++中,一種枚舉類型被定義後,它便成為一種數據類型。並且和其它的數據類型一樣,可以用其標識符來標識它。可以不加上enum修飾詞而隻使用其標識符去說明一個變量。如果有上麵定義的枚舉類型,則下麵的語句是合法的。