Estruturas de dados em C/C++

struct em C e class em C++

Nesta lição, você vai modelar uma conta bancária com struct em C e com class em C++ e ver a diferença entre as duas abordagens.

Introdução

Em C, struct agrupa dados relacionados, e as funções que trabalham com eles ficam separadas. Em C++, class reúne dados e funções-membro (member functions) no mesmo tipo e pode esconder os dados com private para proteger a consistência do objeto.

Pontos importantes

  • Defina as condições que sempre devem ser verdadeiras (invariantes) antes de escrever as operações.
  • Trate os casos de estrutura vazia, cheia e de falha na alocação de memória.
  • Avalie ao mesmo tempo a complexidade e o gerenciamento de memória de cada operação.

Exemplos de código C e C++

C
Executar →
main.c
#include <stdio.h>

typedef struct {
    const char *owner;
    double balance;
} Account;

void deposit(Account *account, double amount) {
    if (amount > 0) {
        account->balance += amount;
    }
}

int main(void) {
    Account account = {"Ada", 100.0};
    deposit(&account, 25.0);
    printf("%s: %.2f\n", account.owner, account.balance);
    return 0;
}
Resultado da execução
Ada: 125.00
C++
Executar →
main.cpp
#include <iomanip>
#include <iostream>
#include <string>
#include <utility>

class Account {
    std::string owner_;
    double balance_;

public:
    Account(std::string owner, double balance)
        : owner_(std::move(owner)), balance_(balance) {}

    void deposit(double amount) {
        if (amount > 0) {
            balance_ += amount;
        }
    }

    void print() const {
        std::cout << owner_ << ": " << std::fixed
                  << std::setprecision(2) << balance_ << '\n';
    }
};

int main() {
    Account account("Ada", 100.0);
    account.deposit(25.0);
    account.print();
}
Resultado da execução
Ada: 125.00

Comparação entre C e C++

Na versão em C, a função deposit recebe um ponteiro para struct Account e só soma o valor quando ele é positivo, mas qualquer trecho de código pode alterar balance diretamente. Na versão em C++, balance_ é declarado antes de public:, então é private por padrão e só muda por métodos válidos como deposit(), o que torna muito difícil criar um estado errado, como um saldo atribuído à toa.

C

Os dados (struct) e as operações ficam separados, e a memória é alocada e liberada à mão.

C++

Classes e contêineres protegem a consistência dos dados e gerenciam os próprios recursos.

Exercícios práticos

Execute as duas versões e depois mude o código para observar a diferença de segurança que cada linguagem oferece.

  • Adicione testes para a estrutura vazia e para quando ela atinge a capacidade.
  • Escreva a liberação de memória e verifique se há vazamentos.
  • Compare a complexidade com o contêiner equivalente da biblioteca padrão.

Pratique com um desafio

Use o conteúdo desta lição para resolver um problema real. Cada desafio roda no navegador, com testes instantâneos e uma revisão por IA.

Todos os desafios