Clique sobre os tópicos listados abaixo para navegar até o conteúdo desejado.

  1. Tipo reference
  2. Características de reference
  3. Reference para structs, enums e unions
  4. Reference e vetor
  5. Passando argumento por referência
  6. Comparando references
  7. Retornando reference

O assunto ponteiro pode ser visto em Tutorial C++: Ponteiro ou Tutorial C: Ponteiro.

Em C++ podemos criar uma variável do tipo de dado reference para armazenar uma referência ou endereço de memória que aponta para uma variável. O tipo reference não permite operações aritméticas e diferente de C, em C++ podemos criar uma variável do tipo reference.

A declaração de uma variável como reference é semelhante a outros tipos de dados, exceto por ser pelo uso do operador (&) pode ser prefixado ao nome da variável ou posfixado no tipo de dado.

Sintaxe
tipo_dado &variavel_ref = variavel;

tipo_dado& variavel_ref = variavel;

Com o uso de uma reference, podemos acessar indiretamente o conteúdo de uma variável como mostrado no exemplo abaixo:

Exemplo 1
#include <iostream>
using namespace std;

int main()
{
    int var1 = 10;
    int &minha_ref = var1; //10
    
    cout << minha_ref; //10
}
Saída
10

Uma variável do tipo reference deve ser declarada com o mesmo tipo de dado que a variável referenciada. Caso contrário, um erro de compilação será gerado.

A atribuição inicial é obrigatória durante a declaração de uma variável do tipo reference, como mostrado nos exemplos abaixo:

Sintaxe
tipo_dado &ref = variavel;
Exemplo 2
#include <iostream>
using namespace std;

int main()
{
    int a;
    int &ref = a;
}
            
Saída
-

O acesso ao valor de uma variável referenciada por uma reference/referência, utilizamos o seu próprio nome, sem uso do operador (&), como pode ser visto abaixo:

Sintaxe: alteração
variavel_referencia = valor;
Sintaxe: acesso
variavel_referencia;
Exemplo 3
#include <iostream>
using namespace std;

int main()
{
    int a; //= 0
    int &ref = a;
    
    ref = 10;// acesso indireto
    cout << a << endl;
    cout << ref;
}
Saída
10

Uma vez que uma variável do tipo reference foi atribuída a uma variável, não pode mais ser atribuída novamente. Uma reference pode ser "vista" como uma constante(const).

Exemplo 4
#include <iostream>
using namespace std;

int main()
{
    int a;
    int &ref = a;
    
    int b;
    &ref = b; //Irá gerar erro
}
Saída
main.cpp: In function ‘int main()’:
main.cpp:10:5: error: lvalue required as left operand of assignment
         10 |     &ref = b;
            

As operações aritméticas de incremento e decremento são aplicadas ao valor da variável a qual uma reference está atribuída. Outras operações aritméticas não são aceitas.

Exemplo 5
#include <iostream>
using namespace std;

int main()
{
    int a = 99;
    int &ref = a;
    cout << a << endl;
    ref++; //incrementando variável a
    cout << ref << endl; //acessando valor de a
}
Saída
99
100

O uso de tipos de dados que possuem membros em conjunto com variáveis do tipo reference, é feita da mesma forma como é feito o uso com tipos de dados primitivos.

Sintaxe
tipo_struct &nome_variavel = variavel_atribuição;
tipo_enum   &nome_variavel = variavel_atribuição;
tipo_union  &nome_variavel = variavel_atribuição;

Para structs e unions, o acesso aos membros é feito utilizando o operador (.) já visto.

Sintaxe
variavel_ref.nome_menbro;
Exemplo 6
#include <iostream>
using namespace std;

enum enum_exemplo{
    VALOR1 = 1,
    VALOR2 = 2
};

struct exemplo{
    int id;
    string desc;
};

union uniao{
    int id;
    float valor;
};

int main()
{
    //union
    uniao u;
    u.id = 999;
    uniao &refu = u; //atribuição
    refu.id = 777; //alteração
    cout << refu.id << endl;
    
    struct exemplo st = {1,"Teste"};
    struct exemplo &refs = st; //atribuição
    refs.id = 2; //alteração
    cout << refs.id << endl;
    
    
    enum_exemplo e = VALOR1;
    enum_exemplo &refe = e;
    refe = VALOR2;
    cout << refe << endl;
}
Saída
777
2
2

O uso do tipo de dado reference com vetores e matrizes é muito limitado devido a ausência de aritmética básica. O acesso é feito atribuindo o endereço de um elemento de uma vetor a uma variável do tipo reference.

Exemplo 7
#include <iostream>
using namespace std;

int main()
{
    int vet[3] = {1,2,3};
    
    //atribuição para elemento na posição 0
    int &ref = vet[0]; 
    ref++; //incrementando conteúdo
    cout << vet[0];
}
Saída
-1 9 235 10 255

Como não é possível utilizar aritmética com o tipo de dado reference não podemos acessar seus elementos por índice, sendo assim, não podemos criar arrays contendo elementos do tipo de dado reference.

Exemplo 8
#include <iostream>
using namespace std;

int main()
{
    int a = 10;
    int b = a;
    int c = b;
    int &vet[3] = {a,b,c}; //irá gerar erro
}
Saída
main.cpp: In function ‘int main()’:
main.cpp:9:10: error: declaration of ‘vet’ as array of references
    9 |     int &vet[3] = {a,b,c};

Em C++, assim como C, a passagem de um argumento como referência é feita utilizando o tipo de dado reference como pode ser visto no exemplo abaixo. O assunto passagem de argumentos por valor ou referência foi visto em C++ Básico: Funções.

Sintaxe
tipo_retorno nome_metodo( tipo_dado &parametro);
Exemplo 9
#include <iostream>
using namespace std;

void funcao(int &valor)
{
    cout << valor << endl;
    valor++;
    cout << valor;
}

int main()
{
    int var1 = 10;
    funcao(var1);
    cout << valor << endl;
}
Saída
10
11
11

No exemplo acima, temos a variável var1 sendo passada como argumento para a função, funcao, utilizando a passagem por referência.

  1. 29/07/2025 - revisão 3 - Correções pontuais; ajustes: sintaxes e target de link 'Funções'
  2. 30/09/2024 - revisão 2 - Correção: em 'intro', 'objetivos' e 'numeração de exemplos; ajustes pontuais
  3. 09/02/2024 - revisão 1 - correção em navegação e erros gramaticais
  4. 30/06/2023 - versão inicial