初始化參考
若要初始化參考類型的變數,必須使用衍生該參考類型之類型的物件,或者其類型可轉換成衍生該參考類型之類型的物件。 例如:
// initializing_references.cpp
int iVar;
long lVar;
int main() {
long& LongRef1 = lVar; // No conversion required.
long& LongRef2 = iVar; // C2440
const long& LongRef3 = iVar; // OK
LongRef1 = 23L; // Change lVar through a reference.
LongRef2 = 11L; // Change iVar through a reference.
LongRef3 = 11L; // C3892
}
使用暫存物件初始化參考的唯一方式是初始化常數暫存物件。 初始化之後,參考類型變數一律會指向相同物件;不能將此變數修改為指向另一個物件。
雖然語法可能相同,但初始化參考類型變數和指派參考類型變數,在語意上是不同的。 在上述範例中,變更 iVar 和 lVar 的指派就初始化而言看似相似,但兩者的作用不同。 初始化會指定參考類型變數所指向的物件;指派則會透過參考指派被參考的物件。
由於將參考類型的引數傳遞至函式以及從函式傳回參考類型的值都是初始化,因此可以正確地初始化參考所傳回的函式型式引數。
只有在下列情況下,可以不使用初始設定式宣告參考類型變數:
函式宣告 (原型)。 例如:
int func( int& );
函式傳回類型宣告。 例如:
int& func( int& );
宣告函式類型類別成員。 例如:
class c { public: int& i; };
宣告明確指定為 extern 的變數。 例如:
extern int& iVal;
初始化參考類型變數時,編譯器會使用下圖所示的決策圖,在建立物件參考或建立參考指向之暫存物件之間做選擇。
初始化參考類型決策圖
若要初始化 volatile 類型 (宣告為 volatile typename**&** identifier) 的參考,可以使用相同類型的 volatile 物件,或者使用尚未宣告為 volatile 的物件。 不過,不能以該類型的 const 物件初始化。 同樣地,若要初始化 const 類型 (宣告為 const typename**&** identifier) 的參考,可以使用相同類型的 const 物件 (或者使用可轉換為該類型的物件或尚未宣告為 const 的物件)。 不過,不能以該類型的 volatile 物件初始化。
若要初始化未以 const 或 volatile 關鍵字限定的參考,只能使用不是宣告為 const 或 volatile 的物件。