Cheatsheet: C → C++
Referência rápida do que muda entre o C que você já sabia e o C++ do curso.
Entrada/saída e strings
| C |
C++ |
Capítulo |
printf("%d", x) |
std::cout << x |
1 |
scanf("%d", &x) |
std::cin >> x |
1 |
char nome[50] |
std::string nome |
1 |
strcpy/strcat |
= / + |
1 |
strcmp(a, b) == 0 |
a == b |
1 |
strlen(s) |
s.size() |
1 |
NULL |
nullptr |
1 |
#define PI 3.14 |
const double PI = 3.14; |
1 |
Funções e parâmetros
| C |
C++ |
Capítulo |
void f(int* x) { *x = 1; } |
void f(int& x) { x = 1; } |
2 |
receber um valor grande por cópia (struct, string...) |
const MeuTipo& (sem copiar) |
2, 3 |
um nome por tipo (abs, fabs, labs) |
sobrecarga: mesmo nome, tipos diferentes |
2 |
enum Cor { VERMELHO } (vaza para int) |
enum class Cor { Vermelho } |
3 |
valor sentinela (-1) para "não encontrado" |
-1 quando índice nenhum é negativo; bool + parâmetro por referência quando todo valor é legítimo |
3 |
Containers
| C |
C++ |
Capítulo |
int v[100]; int n = 0; (tamanho fixo, contador manual) |
std::vector<int> v; |
4 |
int matriz[3][4] |
std::vector<std::vector<int>> |
4 |
n-- para "tirar o último" do vetor |
v.pop_back() (não devolve o valor: leia v.back() antes) |
4 |
| deslocar tudo à mão para tirar um elemento |
v.erase(v.begin() + i) |
8 |
| laço copiando só os que ficam |
v.erase(std::remove_if(v.begin(), v.end(), criterio), v.end()) |
8 |
laço for manual + comparação |
std::sort/std::find/std::count_if (<algorithm>) |
8 |
ponteiro de função (qsort) |
lambda [](int a, int b) { ... } |
8 |
| dois vetores paralelos (chave, valor) |
std::map<Chave, Valor> |
6 |
| checar duplicata na mão |
std::set<T> |
6 |
Tipos e conversões
| C |
C++ |
Capítulo |
(int) x (cast de C, silencioso) |
static_cast<int>(x) (explícito e procurável) |
4 |
size_t de <stddef.h> |
std::size_t (o que .size() devolve) |
4 |
for (int i = 0; i < n; i++) com n à parte |
for (std::size_t i = 0; i < v.size(); i++) |
4 |
percorrer de trás para frente com int i = n - 1 |
int n = static_cast<int>(v.size()); e então int i = n - 1 |
4 |
(double) a / b para evitar divisão inteira |
static_cast<double>(a) / b |
4 |
Arquivos
| C |
C++ |
Capítulo |
FILE*, fopen, fclose |
std::ofstream/std::ifstream (fecha sozinho) |
7 |
fprintf(f, "%s,%d", nome, idade) |
arquivo << nome << "," << idade |
7 |
atoi(texto) |
std::stoi(texto) |
7 |
Orientação a objetos
| C |
C++ |
Capítulo |
struct + funções soltas recebendo a struct |
struct/class com métodos |
3, 9 |
| campos sempre acessíveis |
private + getters/setters (encapsulamento) |
9 |
malloc/free manual |
RAII: construtor adquire, destrutor libera |
10 |
lembrar de free em todo caminho do código |
regra do zero: delegar para vector/unique_ptr |
10 |
struct Base + struct Derivada com ponteiro de função |
herança + virtual/override |
11 |
void* + switch no tipo |
classe abstrata (interface) + polimorfismo |
11 |
um .h/.c por módulo |
um .h/.cpp por classe, mesma ideia |
12 |
Padrão de compilação usado no curso
g++ -std=c++17 -Wall -Wextra arquivo.cpp arquivo_teste.cpp -o programa