正在初始化參考
必須初始化參考型別的變數,從其參考型別衍生,型別的物件或物件型別可以轉換成參考型別衍生的型別。例如:
// 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型別名稱與識別項) 會以初始化volatile物件的相同的型別或物件並未宣告為可volatile。 它們不能,不過,以初始化 const 該型別的物件。同樣地,參考至 const 型別 (宣告為 const型別名稱與識別項) 會以初始化 const 相同型別的物件 (或任何已轉換成該型別或物件並未宣告為可 const)。 它們不能,不過,以初始化volatile該型別的物件。
參考未限定為 const 或volatile關鍵字可以初始化只能與物件宣告為兩者都不 const 或volatile。