C++ é uma linguagem de programação de propósito geral, compilada e de tipagem estática, criada por Bjarne Stroustrup como extensão da linguagem C, lançada em 1985. É amplamente utilizada em sistemas operacionais, jogos, motores gráficos, sistemas embarcados, finanças de alta frequência e competições de programação.
Um dos pontos fortes do C++ é o controle preciso sobre memória e desempenho, sem abrir mão de abstrações modernas. Tornando a linguagem eficiente, robusta e uma excelente opção para quem busca participar de competições de programação.
#include <iostream> using namespace std; int main() { // Meu primeiro programa em C++ cout << "Olá, mundo!" << endl; // Variáveis precisam de declaração de tipo string nome = "C++"; int versao = 23; cout << "Bem-vindo ao " << nome << " " << versao << "!" << endl; return 0; }
new/deleteEm C++, toda variável deve ter seu tipo declarado explicitamente (ou inferido com auto). Os tipos fundamentais são definidos pela linguagem; string vem da STL.
#include <iostream> #include <string> using namespace std; int main() { int x = 42; double y = 3.14; string nome = "C++"; bool ativo = true; // auto infere o tipo automaticamente auto z = 100; // int auto pi = 3.14; // double }
1, -99, 10000003.14f, 3.14"olá"true / false'A', '\n'O tipo int representa números inteiros. Em sistemas modernos, geralmente ocupa 32 bits (4 bytes) e pode armazenar valores de aproximadamente -2 bilhões a +2 bilhões.
int idade = 25; int populacao = 2147483647; // INT_MAX unsigned int positivo = 4000000000; // maior que INT_MAX
Use long long quando precisar de números maiores que 2 bilhões.
float (32 bits) e double (64 bits) são usados para números com casas decimais. double é o padrão recomendado pela maioria dos casos.
float pi_f = 3.14159f; double pi_d = 3.141592653589793; // Cuidado com precisão de ponto flutuante! double a = 0.1 + 0.2; cout << a << endl; // 0.30000000000000004
O tipo string (da biblioteca <string>) representa textos. É uma classe da STL, não um tipo primitivo.
#include <string> using namespace std; string nome = "Lucas"; string completo = nome + " Fernandes"; cout << completo << endl; // Lucas Fernandes // Tamanho e acesso cout << completo.length() << endl; // 15 cout << completo[0] << endl; // L
O tipo bool representa valores lógicos: true ou false. Ocupa geralmente 1 byte.
bool aprovado = true; bool reprovado = false; if (aprovado) { cout << "Parabéns!" << endl; }
char armazena um único caractere (1 byte). Usa aspas simples.
char letra = 'A'; char nova_linha = '\n'; cout << letra << endl; // A
A Standard Template Library (STL) oferece contêineres poderosos e eficientes. Os mais usados são vector, array, map e set.
vector é o contêiner mais usado em C++. É um array dinâmico que cresce automaticamente.
#include <vector> using namespace std; vector<int> nums = {1, 2, 3}; nums.push_back(4); // adiciona 4 nums.pop_back(); // remove último for (int x : nums) { cout << x << " "; } // 1 2 3 4
std::array é um array de tamanho fixo com interface moderna da STL.
#include <array> array<int, 5> arr = {10, 20, 30, 40, 50}; cout << arr[2] << endl; // 30 cout << arr.size() << endl; // 5
map é ordenado (árvore). unordered_map usa hash e é mais rápido para buscas.
#include <map> #include <unordered_map> map<string, int> idades; idades["Lucas"] = 25; unordered_map<string, int> freq; freq["maçã"]++;
set armazena elementos únicos ordenados. unordered_set usa hash.
#include <set> set<int> s = {3, 1, 4, 1, 5}; // s contém: 1, 3, 4, 5 (sem duplicatas) if (s.count(3)) { // true }
Em C++ moderno usamos cout para saída e cin para entrada, da biblioteca <iostream>.
cout é usado para imprimir na tela. Use << para encadear valores e endl ou '\n' para nova linha.
#include <iostream> using namespace std; cout << "Olá, " << "mundo!" << endl; cout << "Idade: " << 25 << "\n";
cin lê da entrada padrão. Use >> para ler valores.
string nome; int idade; cout << "Digite seu nome: "; cin >> nome; cout << "Digite sua idade: "; cin >> idade;
cin >> para na primeira espaço. Para ler frases inteiras use getline(cin, variavel).
C++ possui as estruturas clássicas de controle de fluxo: condicionais e laços.
Estrutura condicional básica.
if (idade >= 18) { cout << "Maior de idade" << endl; } else if (idade >= 0) { cout << "Menor de idade" << endl; } else { cout << "Idade inválida" << endl; }
Laço com contador. A forma moderna com range-based for é muito usada com contêineres.
// for tradicional for (int i = 0; i < 5; i++) { cout << i << " "; } // Range-based for (C++11) vector<int> v = {10, 20, 30}; for (int x : v) { cout << x << " "; }
Executa enquanto a condição for verdadeira.
int i = 0; while (i < 5) { cout << i++ << " "; }
Usado para múltiplas escolhas baseadas em um valor inteiro ou enum.
switch (opcao) { case 1: cout << "Opção 1" << endl; break; case 2: cout << "Opção 2" << endl; break; default: cout << "Opção inválida" << endl; }
Em C++, funções devem declarar explicitamente o tipo de retorno e o tipo de cada parâmetro. Suportam sobrecarga, parâmetros padrão, passagem por referência e funções lambda.
A sintaxe é tipoRetorno nome(parâmetros) { corpo }. Use void quando a função não retorna valor.
// Definição simples int somar(int a, int b) { return a + b; } // Anotações de tipo explícitas double potencia(double base, int exp) { return pow(base, exp); } int resultado = somar(3, 4); cout << resultado << endl; // 7
C++ suporta parâmetros padrão, passagem por valor, por referência (&) e por ponteiro.
// Valor padrão void conectar(string host, int porta = 8080) { cout << "Conectando a " << host << ":" << porta << endl; } conectar("localhost"); // usa porta=8080 // Passagem por referência (modifica original) void dobrar(int& x) { x *= 2; } int n = 5; dobrar(n); cout << n << endl; // 10
Lambdas em C++ (C++11) têm a sintaxe [captura](parâmetros) { corpo }.
// Lambda básica auto dobro = [](int x) { return x * 2; }; cout << dobro(5) << endl; // 10 // Usando com sort vector<pair<string, int>> pessoas = { {"Lucas", 25}, {"Ana", 30} }; sort(pessoas.begin(), pessoas.end(), [](const auto& a, const auto& b) { return a.second < b.second; });
Funções retornam um único valor. Para múltiplos valores use pair, tuple ou struct. Com C++17, structured bindings facilitam o desempacotamento.
#include <tuple> using namespace std; // Retorno múltiplo com pair pair<int, int> minmax_par(vector<int> v) { return {*min_element(v.begin(), v.end()), *max_element(v.begin(), v.end())}; } // Structured binding (C++17) auto [minimo, maximo] = minmax_par({3, 1, 9, 2, 7}); cout << minimo << " " << maximo << endl; // 1 9