Inicializando referências
Variáveis do tipo de referência devem ser inicializadas com um objeto do tipo que o tipo de referência é derivado, ou com um objeto de um tipo que pode ser convertido para o tipo do qual o tipo de referência é derivado.Por exemplo:
// 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
}
A única forma de inicializar uma referência com um objeto temporário é inicializar um objeto temporário constante.Uma vez inicializado, uma variável do tipo de referência sempre aponta para o mesmo objeto; ele não pode ser modificado para apontar para outro objeto.
Embora a sintaxe pode ser a mesma, inicialização de variáveis de tipo de referência e atribuição de variáveis do tipo de referência são semanticamente diferentes.No exemplo anterior, as atribuições que alterar iVar e lVar se parecer com as inicializações, mas ter efeitos diferentes.A inicialização Especifica o objeto para o qual a variável do tipo de referência aponta; a atribuição atribui ao objeto referenciadas através de referência.
Como os passando um argumento de tipo de referência para uma função e retornar um valor do tipo de referência de uma função são inicializações, os argumentos formais para uma função são inicializados corretamente, assim como as referências retornadas.
Variáveis do tipo de referência podem ser declaradas sem inicializadores apenas no exemplo a seguir:
Declarações de função (protótipos).Por exemplo:
int func( int& );
Declarações de tipo de retorno de função.Por exemplo:
int& func( int& );
Declaração de um membro da classe de tipo de referência.Por exemplo:
class c { public: int& i; };
Declaração de uma variável explicitamente especificada como extern.Por exemplo:
extern int& iVal;
Ao inicializar uma variável do tipo de referência, o compilador usa o gráfico de decisão mostrado na figura a seguir para selecionar entre criando uma referência a um objeto ou um objeto temporário para o qual a referência aponta.
Gráfico de decisão para a inicialização de tipos de referência
Referências a volatile tipos (declarada como volatiletypename**&identificador) podem ser inicializados com volatile objetos do mesmo tipo ou com objetos que não tenham sido declarados como volatile. Eles não podem, no entanto, ser inicializada com const objetos desse tipo.Da mesma forma, referências a const tipos (declarada como consttypename&**identificador) podem ser inicializados com const objetos do mesmo tipo (ou qualquer coisa que tenha uma conversão para o tipo ou com objetos que não tenham sido declarados como const). Eles não podem, no entanto, ser inicializada com volatile objetos desse tipo.
Referências que não são qualificadas com o const ou volatile palavra-chave pode ser inicializado somente com objetos declarados como nenhuma const nem volatile.