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:
- Membros podem ter tipos diferentes
- Memória contígua (como arrays)
- 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 ⭐)
#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;
}
Saída:
(program output)
Com structs (conciso):
#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:
struct StructName {
memberType1 memberName1;
memberType2 memberName2;
...
};
Exemplo:
#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
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
Student s1 = {"Alice", 20, 92.5};
Método 2: Inicialização designada de membros (C++20, recomendado)
Student s1 = {.name = "Alice", .age = 20, .score = 92.5};
Método 3: Atribuir valores individualmente
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:
structName.memberName
Exemplo:
#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
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)
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)
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 ⭐⭐)
#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 ⭐⭐⭐)
#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:
========== 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 ⭐)
#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;
}
Saída:
Nome:
Idade:
Nota:
8. Erros Comuns
(1) 8.1 Esquecer o Ponto e Vírgula
Exemplo de Erro:
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:
error: expected ';' after struct definition
(2) 8.2 Acessar um Membro Inexistente
Exemplo de Erro:
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: > -
structtem acesso padrãopublic> -classtem acesso padrãoprivateAlé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).
CPPstruct 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
- Structs combinam múltiplas variáveis de tipos diferentes em uma única unidade
- Declarando uma struct:
struct StructName { lista de membros };(note o ponto e vírgula!) - Inicialização:
StructName variableName = {valor1, valor2, ...}; - Acessando membros:
variableName.memberName - Ao passar como parâmetro, prefira referência
const - Structs também podem ser organizadas em arrays
📝 Exercícios
-
Básico (Dificuldade ⭐): Defina uma struct
Bookcom três membros: título, autor e preço. Crie duas variáveisBooke exiba-as. -
Intermediário (Dificuldade ⭐⭐): Defina uma struct
Rectanglecom dois membros: largura e altura. -
Escreva uma função
double calculateArea(const Rectangle& r)para calcular a área -
Escreva uma função
double calculatePerimeter(const Rectangle& r)para calcular o perímetro -
Teste em
main -
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).
- Struct: empacota diferentes tipos de dados em uma única unidade
- Acesso a membros usa o operador .; ponteiros usam ->
- Inicialização: inicialização uniforme {} ou atribuição membro a membro
- Structs podem ser usadas como parâmetros e retornos de função
- Arrays de structs gerenciam múltiplos registros
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!