[quote=ViniGodoy]Eu ressalto ainda a importância de se pegar livros de boas práticas com C++, como o Effective C++ ou o Exceptional C++.
O C++ tem algumas características, que o torna diferente do Java e do C#:
“C++ is designed to give the programmer choice, even if this makes it possible for the programmer to choose incorrectly”
Ou seja, a linguagem é muito poderosa, mas se você não tomar muito cuidado, pode acabar se complicando. As linguagens modernas tentam evitar o erro dos programadores ao máximo, mesmo que isso custe a eles abrir mão de certos recursos.
Com o C++ é ao contrário. Se um recurso pode ter certa utilidade, ele vai estar lá, mesmo que ele seja extremamente perigoso. Você é o especialista, então, é você quem manda.
Exemplos disso no Java é a ausência de sobrecarga de operadores, ou a possibilidade de trabalhar com memória de maneira não-gerenciada, ou uma API que facilite o uso do JNI. No C++, podemos citar a possibilidade de manipular ponteiros diretamente ou de sobrecarregar o new e o delete para escrever, você mesmo, seu próprio memory manager.
O segundo “problema” é também esse aqui:
# C++ is designed to be as compatible with C as possible, therefore providing a smooth transition from C
Ou seja. Por padrão, C++ é compativel com C. Em muitos aspectos, isso é ótimo. Você pode usar livremente bibliotecas do C no C++, como a excelente SDL, ou o próprio DirectX e OpenGL. Entretanto, isso leva a uma desvantagem séria: Muitos recursos estão presentes na linguagem só para manter a compatibilidade com C, não porque seria recomendável utiliza-los. E isso também dá margem a um programador C chegar cheio de vícios no C++, e aplica-los totalmente (como o uso de macros no lugar de funções inline, por exemplo, ou passar argumentos através de ponteiros no lugar de referências const).
Por fim, o último ponto:
C++ is designed to directly and comprehensively support multiple programming styles (procedural programming, data abstraction, object-oriented programming, and generic programming);
Se no Java, quando você tenta misturar 2 paradigmas (o reflexivo e o OO) você já se complica todo, extrapole isso para o C++, que implementa 3 paradigmas: procedural, orientado a objetos e metaprogramação. É importante também ressaltar que o último paradigma é o responsável pela maior parte da evolução do C++ nos últimos anos.
Os livros de boas práticas também mostram que a maior parte da evolução do C++ está nas suas libs, e não necessariamente na linguagem. Hoje, não se fala em criar novos programas em C++ sem usar, por exemplo, os Smart Pointers. E eles praticamente implementam um garbage collector em C++, o que te livra de centenas de dores de cabeça relacionadas a ponteiros. Graças a metaprogramação, evoluções nas bibliotecas do C++ também se aproximam muito de evoluções na própria linguagem. Exemplos disso são as lambda functions da boost, ou o próprio boost for…each. Sem falar claro, nas APIs da boost e STL, que contém uma série de classes que quem costuma falar mal do C++ geralmente ignora solenemente.
O roadmap cobre livros que falam de todos esses tópicos. Após estuda-los você geralmente tem uma vida mais tranquila e feliz com o C++. Muitos dos problemas, especialmente os relacionados a ponteiros, simplesmente desaparecem. Reforçam-se conceitos modernos da linguagem, como constness ou RAII, e tem-se acesso a várias bibliotecas do C++, que facilitam muito o desenvolvimento.[/quote]
Vini,
você aprendeu C++ somente lendo e praticando ou fez algum curso específico?