C++, a casa automática do Viniccius13, só que tudo tem TNT.
C++ é outra linguagem merda. É basicamente o "antecessor" do Java, então você deve imaginar o tamanho da trolha que a gente vai ver aqui.
Design
Puro chorume. Sério, vamos começar com o básico, vamos dominar o "print". No C, a gente faz print de hexadecimal de forma bem simples.
printf("%08X\n", value);
No C++:
std::cout << std::setfill('0') << std::setw(8) << std::hex << value << std::endl;
ou
cout << setfill('0') << setw(8) << hex << value << endl;
Se você fizer a cagada de colocar using namespace std;
Nem consegue
distinguir nessa caralha o que é variável e o que é elemento do print.
Pior, vamos fazer um print de um numero normal e um número hexadecimal.
C:
printf("%d: %08X\n", line, value);
C++:
std::cout << std::decimal << line << ": "
<< std::hex << std::setfill('0') << std::setw(8) << value
<< std::endl;
Puta que pariu. Acho que o incremento no "C++" foi de verbosidade e ilegibilidade, vai tomar no rabo.
C++ tem exceptions, sabia? O try-catch
da filha da puta do Java veio
do C++, e acredite, consegue ser PIOR do que a do Java.
#include <iostream>
#include <string>
static void func() {
throw (int)5;
}
int main()
{
try {
func();
} catch(std::string str) {
std::cerr << str << std::endl;
}
}
ESSA PORRA COMPILA E LINKA, CARALHO! Testei aqui, e ainda daria Segfault
se o GCC não tivesse adicionado proteção no código! Mas vamos ser realistas,
try-catch
é uma merda tão grande que nem os programadores dessa merda usam.
Templates
Template é usado pra caralho, aliás, a própria biblioteca padrão do C++ se chama STL, ou Standard Template Library. Não deve ser ruim.
#include <iostream>
#include <string>
template<bool b>
struct test;
template<>
struct test<true> {
int foo;
};
template<>
struct test<false> {
char bar;
};
int main()
{
test<true> foo;
test<false> bar;
}
Sim, isso é possível. Eu realmente não sei o motivo de você pode fazer isso, isso só vai atrasar a porra do debug, mas isso é possível. Mas isso me deixa uma pergunta, true e false são tipos ou valores? Vai entender.
"Mas com certeza template library ajuda, cara! É só decorar todos os jeitos de como o compilador vai conseguir deduzir o tipo de valor que ele está trabalhando! AUTOMAÇÃO, CARA!" Patético. Automação é só no código mesmo, porque o nível de trabalho até piorou. Nem queira imaginar como você vai debugar esse código aí.
Overloading
Em falar em dedução, no C++ a gente tem overloading, inclusive de operador! Fantástico, vamos brincar com isso.
#include <iostream>
struct value {
int foo = 0;
void operator+=(float value) {
std::cout << "adicionando float" << std::endl;
}
void operator+=(double value) {
std::cout << "adicionando double!" << std::endl;
}
};
int main()
{
value v;
v += 10;
}
Resultado: compilation failed: ambiguous! :D
Overloading é tão automatico que falha automaticamente.
Compilação
O arquivo "main" que eu fiz pra fazer os testes desses programas tem menos de 20 linhas e o tempo de execução do g++ foi de 0.2 segundos. Não parece muito, mas programas feitos com essa merda costumam ter mais de 100 arquivos, e todos os arquivos com pelo menos 200 linhas. Vamos fazer um calculo básico: se um programa de 20 linhas demorou 0.2 segundos, com 200 linhas vai demorar um pouco mais de 1 segundo, contanto com os comentários e linhas vazias. Então 100 arquivos vai demorar 100 segundos, ou 1m30s. Caralho, nem GCC consegue fazer essa merda, e se a gente for considerar os compiladores mais simples como o TCC, essa merda é um inferno pra compilar.