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

  1. Declarando uma struct
  2. Acessando/alterando valores de membros
  3. Struct como parâmetro/argumento e retorno
  4. Struct como retorno
  5. Usar vetor/matriz de struct
  6. Passagem de struct por referência
  7. Struct com reference como membro
  8. Atributos
  9. Métodos
  10. Struct e typedef
  11. Comparar struct: campo a campo
  12. Comparar struct: sobrecarga de ==
  13. Copiar struct elemento a elemento
  14. Outros tipos de dados como membros

Os assuntos vetor e matriz foram vistos em C++ Básico: Vetor e C++ Básico: Matriz.

O tipo struct é um tipo de dado complexo que é composto de um ou mais membros de tipos de dados diferentes. Na linguagem C++, diferente de C, as struct aceitam características P.O.O como: atributos, métodos e herança, por exemplo.

A sintaxes 1 e 2 abaixo mostram respectivamente a declaração do tipo de dado struct e a declaração de uma variável utilizando esse mesmo tipo.

Sintaxe 1
struct nome_struct
{
  tipo_dado1 membro1;
  tipo_dado2 membro2;
  tipo_dado3 membroN;
};

O corpo de uma struct é delimitado por { e } e seus membros são separados por (;) e podem ser iniciados ou não. Uma struct deve ser teminada utilizando (;).

Sintaxe 2
struct nome_struct nome_variavel; //não iniciada

struct nome_struct nome_variavel = nome_struct { valor_membro1, valor_membro2, ...}
Exemplo 1
#include <iostream>
using namespace std;
struct teste
{
    int valor;
    char caracter;
};

int main(void)
{
    struct teste variavel;
    struct teste variavel2 = teste{1,'Z'};
}

O acesso aos membros de um struct é feita utilizando o operadore (.) seguido do nome do do membro como pode ver visto nas sintaxes abaixo:

Sintaxe: acesso
variavel_struct.nome_membro;
Sintaxe: alteração
variavel_struct.nome_membro = valor;
Exemplo 2
#include <iostream>
using namespace std;
struct teste
{
    int valor;
    char caracter;
};

int main(void)
{
    struct teste variavel;
    variavel.valor = 10;
    variavel.caracter = 'A';
    cout << "valor:" << variavel.valor << " caracter:" << variavel.caracter;
    return 0;
}
Saída
10 A

O uso de struct como parâmetro de um função e a passagem como argumento é semelhante a como é feito com os outros tipos de dados primitivos. Declaramos um parâmetro com o tipo de dado struct.

Sintaxe
tipo_retorno nome_funcao(struct nome_struct nome_param)
{
  //corpo
}
Onde
nome_struct: nome do tipo de dado da struct definido.
nome_funcao: nome da função desejada.
Exemplo 3
#include <iostream>

struct teste
{
    int valor;
    char caracter;
};

void funcao(struct teste param)
{
      cout << "valor:" << param.valor << " caracter:" << param.caracter;
}

int main()
{
    struct teste variavel;
    variavel.valor = 10;
    variavel.caracter = 'A';

    funcao(variavel);
}
Saída
valor:10 caracter:A

Os conceitos de passagem por valor e por referência também são aplicados ao uso do tipo de dado struct quando usado como parâmetro/argumento.

O retorno do tipo de dado por uma função é feita da mesma forma utilizada como outros tipos de dados. Utilizamos a palavra reservada return seguido da uma variável do tipo struct.

Sintaxe
struct nome_struct nome_funcao(<lista_parametros>)
{
  //corpo omitido
   return variavel_struct;
}
Onde
variavel_struct: variavel to tipo struct retornado.
<lista_parametros>: lista de parâmetros da função.
Exemplo 4
#include <iostream>
using namespace std;
struct teste
{
    int valor;
    char caracter;
};

struct teste funcao(void)
{
    struct teste var1;
    var1.valor = 1;
    var1.caracter = 'A';
    return var1;    
}

int main(void)
{
    struct teste var1 = funcao();
    cout << var1.valor<< endl;    
    return 0;
}
Saída

10

O uso de structs como matrizes ou vetores é feito da mesma forma que outros tipos de dados. Definimos suas dimensões utilizando [] e acessamos seus elementos utilizando seus índices ou linha e colunas.

Sintaxe: vetor
struct nome_struct vetor[num_elem] = {valores};
struct nome_struct vetor[indice];
Sintaxe: matriz
struct nome_struct matriz[linhas][colunas] = {{valores}};
struct nome_struct matriz[linhas][colunas];
Onde
num_elem: número de elementos contido no vetor
linhas: número de linhas da matriz
colunas: número de colunas da matriz
valores: lista de valores

Para iterar elementos de matrizes e vetores os comandos de repetição while ou for podem ser utilizados. Os comandos de repetição foram vistos em C++ Comandos de Repetição.

Exemplo 5
#include <iostream>
using namespace std;

struct teste
{
    int valor;
    char caracter;
};

int main(void)
{
    struct teste var1;
    struct teste var2;
    
    var1.valor = 1;
    var1.caracter = 'A';
    
    var2.valor = 2;
    var2.caracter = 'B';
    
    struct teste vetor[2];
    vetor[0] = var1;
    vetor[1] = var2;
    
    return 0;
}
Saída
-
  1. 28/07/2025 - revisão 3 - correções pontuais; ajuste em sintaxes
  2. 30/09/2024 - revisão 2 - Correção: Ex. 2, Ex. 3; Ajustes gramaticais pontuais e outros
  3. 09/02/2024 - revisão 1 - correção em navegação, exemplos e erros gramaticais
  4. 30/06/2023 - versão inicial