初始化引用

变量引用类型必须初始化引用类型派生类型的对象,或者使用可以转换为类型引用类型派生的类型的对象。 例如:

// 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声明的对象。

请参见

参考

初始值设定项