C++: Noções Básicas de Struct

Última atualização: 2026-08-26

Arrays podem armazenar múltiplos valores do mesmo tipo, mas e se você precisar armazenar o nome (string), idade (inteiro), nota (ponto flutuante) de um estudante?

É aí que entram as structs — combinando múltiplas variáveis de tipos diferentes em uma única unidade.


1. O que é uma Struct?

(1) 1.1 Structs no Dia a Dia

Exemplo do Dia a Dia Equivalente no Programa
Um cartão de visitas (nome, telefone, email) Struct
Um livro (título, autor, preço) Struct
Um estudante (nome, idade, nota) Struct

Características das Structs:

  1. Membros podem ter tipos diferentes
  2. Memória contígua (como arrays)
  3. Um precursor das "classes" (você aprenderá classes depois)

(2) 1.2 Por que Precisamos de Structs?

Sem structs (tedioso):

▶ Exemplo 2: Exemplo de Código (Dificuldade ⭐)

CPP
#include <iostream>
#include <string>

int main() {
 std::string name1 = "Alice";
 int age1 = 20;
 double score1 = 92.5;
 
 std::string name2 = "Bob";
 int age2 = 21;
 double score2 = 88.0;
 // ... você precisaria declarar 3 × 100 variáveis!
 
 return 0;
}
▶ Experimente

Saída:

TEXT 📖 Somente leitura
(program output)

Com structs (conciso):

CPP
#include <iostream>
#include <string>

struct Student {
 std::string name;
 int age;
 double score;
};

int main() {
 Student s1 = {"Alice", 20, 92.5};
 Student s2 = {"Bob", 21, 88.0};
 // ... muito mais limpo!
 
 return 0;
}


2. Declarando e Definindo Structs

(1) 2.1 Declarando uma Struct

Sintaxe:

TEXT 📖 Somente leitura
struct StructName {
 memberType1 memberName1;
 memberType2 memberName2;
 ...
};

Exemplo:

CPP
#include <iostream>
#include <string>

// Declarar uma struct
struct Student {
 std::string name;
 int age;
 double score;
}; // ⚠️ Nota: o ponto e vírgula é obrigatório!

int main() {
 // ...
 return 0;
}

💡 Ponto Importante: Uma declaração de struct termina com um ponto e vírgula! Este é um erro comum entre iniciantes.



3. Criando e Inicializando Variáveis Struct

(1) 3.1 Criando uma Variável Struct

CPP
Student s1; // Criar uma variável s1 do tipo Student

(2) 3.2 Inicializando uma Variável Struct

Método 1: Inicializar na ordem da declaração

TEXT 📖 Somente leitura
Student s1 = {"Alice", 20, 92.5};

Método 2: Inicialização designada de membros (C++20, recomendado)

CPP
Student s1 = {.name = "Alice", .age = 20, .score = 92.5};

Método 3: Atribuir valores individualmente

TEXT 📖 Somente leitura
Student s1;
s1.name = "Alice";
s1.age = 20;
s1.score = 92.5;

💡 Dica: Recomenda-se o Método 1 ou Método 2 por serem mais concisos.



4. Acessando Membros da Struct

(1) 4.1 Lendo Membros

Sintaxe:

TEXT 📖 Somente leitura
structName.memberName

Exemplo:

CPP
#include <iostream>
#include <string>

struct Student {
 std::string name;
 int age;
 double score;
};

int main() {
 Student s1 = {"Alice", 20, 92.5};
 
 std::cout << "Nome: " << s1.name << std::endl; // Alice
 std::cout << "Idade: " << s1.age << std::endl; // 20
 std::cout << "Nota: " << s1.score << std::endl; // 92.5
 
 return 0;
}

(2) 4.2 Modificando Membros

TEXT 📖 Somente leitura
Student s1 = {"Alice", 20, 92.5};
s1.score = 95.0; // Modificar a nota
std::cout << "Nova nota: " << s1.score << std::endl; // 95.0


5. Passando Structs como Parâmetros de Função

(1) 5.1 Passagem por Valor (Não Recomendado)

CPP
void printStudent(Student s) { // ❌ Passagem por valor: copia a struct inteira, custoso
 std::cout << "Nome: " << s.name << std::endl;
}

(2) 5.2 Passagem por Referência (Recomendado)

TEXT 📖 Somente leitura
void printStudent(const Student& s) { // ✅ Passagem por referência: sem cópia, e não pode modificar
 std::cout << "Nome: " << s.name << std::endl;
 std::cout << "Idade: " << s.age << std::endl;
 std::cout << "Nota: " << s.score << std::endl;
}

💡 Regra de Ouro: Ao passar uma struct como parâmetro, prefira referência const — evita o custo de cópia e previne modificação acidental.



6. Arrays de Structs

Structs também podem ser organizadas em arrays!

Exemplo: Array de Estudantes (Dificuldade ⭐⭐)

CPP
#include <iostream>
#include <string>

struct Student {
 std::string name;
 int age;
 double score;
};

int main() {
 Student students[3] = {
 {"Alice", 20, 92.5},
 {"Bob", 21, 88.0},
 {"Charlie", 19, 95.0}
 };
 
 // Percorrer o array de structs
 for (int i = 0; i < 3; i++) {
 std::cout << "========== Estudante " << i + 1 << " ==========" << std::endl;
 std::cout << "Nome: " << students[i].name << std::endl;
 std::cout << "Idade: " << students[i].age << std::endl;
 std::cout << "Nota: " << students[i].score << std::endl;
 std::cout << std::endl;
 }
 
 return 0;
}


7. Prática: Gerenciamento de Notas de Estudantes (Versão com Struct)

▶ Exemplo 1: Gerenciamento Completo de Notas (Dificuldade ⭐⭐⭐)

TEXT 📖 Somente leitura
#include <iostream>
#include <string>
#include <vector> // aprenderemos vector depois, usando array por enquanto

struct Student {
 std::string name;
 int age;
 double score;
};

// Declaração de funções
void addStudent(Student students, int& count);
void printStudents(const Student students, int count);
double calculateAverage(const Student students, int count);

int main() {
 const int MAX_STUDENTS = 100;
 Student students[MAX_STUDENTS];
 int count = 0;
 
 int choice;
 do {
 std::cout << "========== Gerenciamento de Notas ==========" << std::endl;
 std::cout << "1. Adicionar estudante" << std::endl;
 std::cout << "2. Exibir todos os estudantes" << std::endl;
 std::cout << "3. Calcular média" << std::endl;
 std::cout << "4. Sair" << std::endl;
 std::cout << "Selecione (1-4): ";
 std::cin >> choice;
 
 if (choice == 1) {
 addStudent(students, count);
 } else if (choice == 2) {
 printStudents(students, count);
 } else if (choice == 3) {
 if (count == 0) {
 std::cout << "Não há dados de estudantes!" << std::endl;
 } else {
 std::cout << "Média: " << calculateAverage(students, count) << std::endl;
 }
 } else if (choice == 4) {
 std::cout << "Até logo!" << std::endl;
 } else {
 std::cout << "Erro: Por favor, digite um número entre 1-4!" << std::endl;
 }
 
 std::cout << std::endl;
 
 } while (choice != 4);
 
 return 0;
}

// Definição de funções
void addStudent(Student students, int& count) {
 if (count >= 100) {
 std::cout << "Número máximo de estudantes atingido!" << std::endl;
 return;
 }
 
 std::cout << "Digite o nome: ";
 std::cin.ignore();
 std::getline(std::cin, students[count].name);
 
 std::cout << "Digite a idade: ";
 std::cin >> students[count].age;
 
 std::cout << "Digite a nota: ";
 std::cin >> students[count].score;
 
 count++;
 std::cout << "Adicionado com sucesso!" << std::endl;
}

void printStudents(const Student students, int count) {
 if (count == 0) {
 std::cout << "Não há dados de estudantes!" << std::endl;
 return;
 }
 
 std::cout << "\n========== Lista de Estudantes ==========" << std::endl;
 for (int i = 0; i < count; i++) {
 std::cout << i + 1 << ". Nome: " << students[i].name 
 << ",Idade: " << students[i].age 
 << ",Nota: " << students[i].score << std::endl;
 }
 std::cout << "================================\n\n";
}

double calculateAverage(const Student students, int count) {
 if (count == 0) {
 return 0.0;
 }
 
 double sum = 0.0;
 for (int i = 0; i < count; i++) {
 sum += students[i].score;
 }
 
 return sum / count;
}

Saída:

TEXT 📖 Somente leitura
========== Gerenciamento de Notas ==========
1. Adicionar estudante
2. Exibir todos os estudantes
3. Calcular média
4. Sair
Selecione (1-4): 
Não há dados de estudantes!
Média: 
Até logo!
Erro: Por favor, digite um número entre 1-4!
Número máximo de estudantes atingido!
Digite o nome: 
Digite a idade: 
Digite a nota: 
Adicionado com sucesso!
Não há dados de estudantes!

========== Lista de Estudantes ==========
. Nome: 
==============================



▶ Exemplo 3: Struct como Retorno de Função (Dificuldade ⭐)

CPP
#include <iostream>
#include <string>

struct Student {
    std::string name;
    int age;
    double score;
};

// Função que retorna uma struct
Student createStudent(std::string n, int a, double s) {
    Student stu;
    stu.name = n;
    stu.age = a;
    stu.score = s;
    return stu;
}

int main() {
    Student s1 = createStudent("Zhang San", 20, 92.5);
    
    std::cout << "Nome: " << s1.name << std::endl;
    std::cout << "Idade: " << s1.age << std::endl;
    std::cout << "Nota: " << s1.score << std::endl;
    
    return 0;
}
▶ Experimente

Saída:

TEXT 📖 Somente leitura
Nome: 
Idade: 
Nota: 
💡 Dica: Structs podem ser usadas como retornos de função para criar e inicializar objetos struct.


8. Erros Comuns

(1) 8.1 Esquecer o Ponto e Vírgula

Exemplo de Erro:

TEXT 📖 Somente leitura
struct Student { // ❌ Esqueceu o ponto e vírgula
 std::string name;
 int age;
 } // ❌ Deveria haver um ponto e vírgula aqui

int main() {
 // ...
}

Mensagem de Erro do Compilador:

TEXT 📖 Somente leitura
error: expected ';' after struct definition

(2) 8.2 Acessar um Membro Inexistente

Exemplo de Erro:

CPP
struct Student {
 std::string name;
 int age;
};

int main() {
 Student s1;
 s1.score = 92.5; // ❌ Erro: Student não tem membro score
 return 0;
}

❓ Perguntas Frequentes

P: Qual a diferença entre struct e class? R: Abordaremos classes em detalhes depois, mas resumidamente: > - struct tem acesso padrão public > - class tem acesso padrão private

Além disso, structs também podem ter funções membro, construtores, etc. (você aprenderá isso depois).

P: Uma struct pode conter outra struct? R: Sim! Isso se chama struct aninhada. > > struct Address { > std::string city; > std::string street; > }; > > struct Student { > std::string name; > Address addr; // struct aninhada > }; > > int main() { > Student s1; > s1.addr.city = "Wuhan"; > s1.addr.street = "Meijia Road"; > } > P: Quanta memória uma variável struct ocupa? R: Igual à soma do tamanho de todos os membros (com possível overhead de "alinhamento de memória", abordado depois).

CPP
struct Example {
char c; // 1 byte
int i; // 4 bytes
};

std::cout << sizeof(Example) << std::endl; // Pode exibir 8 (não 5!)

P: O que é mais importante sobre noções básicas de struct? R: Entenda os conceitos fundamentais primeiro, depois reforce-os com exemplos práticos.

📖 Resumo


📝 Exercícios

  1. Básico (Dificuldade ⭐): Defina uma struct Book com três membros: título, autor e preço. Crie duas variáveis Book e exiba-as.

  2. Intermediário (Dificuldade ⭐⭐): Defina uma struct Rectangle com dois membros: largura e altura.

  3. Escreva uma função double calculateArea(const Rectangle& r) para calcular a área

  4. Escreva uma função double calculatePerimeter(const Rectangle& r) para calcular o perímetro

  5. Teste em main

  6. Desafio (Dificuldade ⭐⭐⭐): Defina uma struct Date (ano, mês, dia), e escreva uma função para verificar se uma data é válida (ex.: 2024-02-29 é válida, 2023-02-29 é inválida).


9. 🚀 Próximos Passos

Agora que você aprendeu structs, vamos avançar para a Fase 4 (Ponteiros e Referências) — a parte mais central e desafiadora do C++, mas dominá-la permitirá que você escreva código mais eficiente!

Web-Tutorial.com

Equipe Técnica Web-Tutorial

Uma plataforma de tutoriais mantida por diversos desenvolvedores. Cada tutorial é escrito e revisado por profissionais da área correspondente. Trabalhamos para manter nosso conteúdo preciso e confiável — se encontrar algum problema, avise-nos.

100%