C++

Sei pouco de C e pode-se dizer que tenho um pouco de experiência em Java.
Aprender C++ seria muito complexo se tenho pouca base de C (quando digo pouca base, se resume a ponteiros, estruturas e alocação)?

Rapaz, acho que você está amis do que pronto pra cair pra cima do C++!

O que mais vai pegar pra você agora é a Orientação à Objetos, mas se você já tem esses conceitos do Java, vai ser mais fácil para você.

Acho que a linguagem mais difícil de se aprender é a primeira. A segunda é só um pouco difícil. Com o passar do tempo, cada nova linguagem se torna mais fácil.

IMHO, aprender C++ já sabendo C é meio traiçoeiro, porquê a pessoa é tentada a continuar usando o estilo do C em vez dos do C++. Por exemplo:

  • Usar char* em vez de string
  • Alocar memória usando malloc
  • Usar i/o do C em vez da iostream
  • Declaram todas as variáveis no topo da função, em vez de declará-las apenas quando forem necessárias

Etc.

Mas, como você já é um programador Java, se sentirá em casa com C++. Apenas pegue um livro que ensine realmente C++ e mantenha distância de livros de C++ que começam a ensinar C e depois C++. Um bom livro que entra direto no C++ é o livro do Deitel.

Use e abuse da STL. E se fores usar o Visual C++ sem se preocupar com portabilidade, use CString no lugar da string da STL e dê uma boa lida na ATL. Praticamente tudo da ATL tem gerenciamento automático de memória e as funções da Microsoft agora têm checagem de memory leaks (todas as terminadas em _s, como strcpy_s, memcpy_s, …).

Nossa, chega a me confortar ouvir isso.
O único problema comigo em C são ponteiros, porém gosto bastante desse lado da programação próxima ao hardware. Eu gostei bastante de OO, então juntando os dois, achei C++. Nas férias da faculdade vou começar a pegar sério em C++.

Declarar char*, char[] e coisarada pra mim é um horror, porque sempre me perco. Em alocar memória também para um determinado array… enfim… ainda preciso praticar muito essa linguagem C. Tenho um projeto, que espero passar para C++ ou C nas férias. Acho que C++ é mais provável, porque C está osso pra mim.

Sobre o compilador, não sei qual vou usar ainda, mas provavelmente algum da GNU, pois uso Linux (G++).

Abraço e obrigado pelas respostas :smiley:

Faço minhas as palavras do LastClick.

Especialmente no que diz respeito a usar o estilo do C++. Programar C++ sem a STL é como querer programar Java usando sem usar a API. Uma perda de tempo, esforço e uma burrice completa. Além disso, abusar de ponteiros, usar defines no lugar de const, macros no lugar de inline, códigos de retorno no lugar de exceptions, são outros exemplos dessa falta de estilo. E isso só complica a vida. O C++ não inseriu esses mecanismos melhores à toa.

Esses tempos atrás, coloquei um roadmap de livros sobre C++ aqui no GUJ, creio que ele possa te ajudar:
http://www.guj.com.br/posts/list/2238.java

No meu blog (que está na minha assinatura), tem um tutorial sobre como instalar do MinGW (compilador GNU para Windows) e o Code::Blocks (IDE baseada em wxwidgets, com versões para diversos SOs). Eu sugiro que você confira especialmente o Code::Blocks.

Eu tenho uma cisma com CStrings (MFC) que vem de longe. Se puder, saiba o que é uma CString (se precisar de manter um código que usa CStrings), mas não use em código novo; prefira a STL, que, entre outras vantagens, permite que seu código funcione tanto em Windows quanto em Linux/Unix.

É que já tive de resolver uns problemas de vazamento de memória insidiosos que advinham do uso do método CString::GetBuffer; isso me vacinou um pouco contra as CStrings.

Procure usar a std::string da STL; ela é como se fosse uma mistura de String e StringBuilder (ou seja, tem a versatilidade da String e os recursos de concatenação da StringBuilder).

O problema é que ela não tem aquelas comodidades da CString de formatação (como o String.format do Java 5.0).

Mas isso se resolve com facilidade usando <strstream> ou então criando uma função que aceite uma std::string e processe usando a velha e boa sprintf (estou usando _vsnprintf, que é uma versão “segura” da sprintf, abaixo). Exemplo de um código que funciona muito bem comigo:

...
#include <string>
#include <iostream>
using namespace std;
...
class Util {
    static string format (const char * fmt, ...);
};
...
/**
 * Rotina utilitária, que se comporta como se fosse a java.lang.String.format do Java.
 * @param fmt O formato, em estilo printf.
 * @param args Os argumentos, em estilo printf.
 * @return Uma std::string (tamanho máximo: 2048 caracteres) formatada por sprintf.
 */
string Util::format(const char * fmt, ...)
{
    const int BUFSIZE = 2048;
    char buf [BUFSIZE];
    va_list arglist;
    va_start (arglist, fmt);
    ::_vsnprintf (buf, BUFSIZE, fmt, arglist);
    va_end (arglist);
    return buf;
}
...
// Exemplo de uso
cout << Util::format ("Hello, world! %d + %d = %d", 2, 2, 2+2) << endl;
...

Use sempre o pacote doxygen para documentar seus programas (você pode usar quase que as mesmas tags do javadoc
para criar páginas com diagramas UML que são mais sofisticadas que as criadas pelo javadoc. Para mais informações:
http://www.doxygen.org )

Aqui tivemos não só problemas de memória com CString como também percebemos o seguinte:

  • Ela é menos segura do que a classe std::string. Menos verificações nos parâmetros são feitas;
  • Se você pensa que ela abriu mão de segurança por performance (como fez a STL), se enganou. Ela é mais lenta do que o std::string. Nosso código conseguia processar 2mb/s de texto com CString e, ao modificar para std::string, o mesmo código, rodando na mesma máquina passou a processar mais de 10 mb/s;

Se não me engano, é porque a CString contém um lock também. A std::string não tem nenhum lock.
O problema desse lock é que, diferentemente do Java, o compilador não consegue remover esse lock sozinho, e esse lock não é algo da biblioteca do C++ mas sim do próprio Windows - como vocês devem se lembrar, usar um StringBuffer em vez de um StringBuilder só não é muito mais lento em Java (apesar de ter acesso sincronizado), porque o JIT Compiler (HotSpot) consegue eliminar o lock se conseguir determinar que o objeto é usado por apenas uma thread.

Thingol e ViniGodoy: Só para alinharmos, poderiam me informar a versão do Visual Studio que estão usando e se está com algum service pack?

Aqui trabalhamos com muitos programas em c++ de processamento de arquivos, servidores tcp, udp e web services.

Então, é de meu interesse saber mais sobre esses problemas. Não temos problemas como os relatados por vocês, mas, não quer dizer que não existam.

Aqui usamos Visual Studio 2005 com o SP1 aplicado. Os servidores são Windows 2003 EE x64.

Galera, agradeço mesmo as respostas de todos.
Me clarearam muito a mente… muita gente me falou que para saber C++ é preciso saber C do avesso e pelo que vejo, me falaram muita m*****.

Muito obrigado mesmo!

Aqui na Siemens: meus colegas usam Visual Studio 2005 Service Pack 1. Eu trabalho somente com java (espero entrar em projetos C++ no futuro, mas ainda não pintou nenhum).

Em meus projetos pessoais e da pós: Uso o MinGW 5.1.3, GDB 5.2.1, com a última nightly build do Code::Blocks.

Ah…certo…valeu, Godoy. Não conhecia esse MingW, só o Dev-C++ (que não deixa de ser também o GCC), além do VC2005.

dedejava:
Estudei por esse livro aqui:

Novo é meio caro, mas, tem usado começando em US$ 38,00.

Dê uma lida nas reviews. Eu li e recomendo, mas, acho que alguém já experiente pode achar o livro muito detalhista.

Alguém recomendou também o Accelerated C++: Practical Programming by Andrew Koenig, mas, é bom ver se é para iniciante ou para alguém já experiente.

E uns conselhos bons retirados dos comentários:

Some helpful tips for those who just started learning C++.

  1. Keep in mind that C++ is a very hard and tough programming language to master.

C++ is arguably the most complicated programming language available today. It is by no mean THE perfect programming language, and it requires the tremendous amount of responsibilities from the programmer. However, no other language is as powerful, versatile, and flexible as C++. It gives the programmers the assembly-language-like freedom with the data types and the memory management. It offers the programmers the characteristics of both the high-level language and low-level language. It also provides the programmers both the efficient structure-oriented features and the strong object-oriented features at the same time.

  1. C++ is not C, although C++ is derived from C language.

Although C++ is derived from C and inherited many features from C, C++ is NOT C. They are totally two different and separate languages just as Java is not C++. C is a structure-oriented language while C++ is object-oriented language. C++ has many new features that C can’t even begin to dream about. Give C++ all due respect.

  1. The perfect C++ textbook does not exist, so stop trying to find one.

Muito pertinentes os conselhos…

O DevCpp também usa o MinGW como compilador no Windows. Eu acho ele uma IDE muitíssimo limitada. O debbuger não roda direito, a identação não funciona, fora que há anos ninguém faz um update.

O Code::Blocks é indiscutivemente muitíssimo superior e também free. Há instruções de como instala-lo no meu blog (foi o último artigo que postei). O Code::Blocks, por ser implementado sobre a wxWidgets, também tem versões para Linux e Mac. A versão oficial é antiga, mas as nightly builds são muito estáveis e sai praticamente uma por dia. O uso da nightly é recomendado no próprio site oficial. A comunidade desenvolvedora está muito ativa e, se você postar um bug por lá, terá a resposta em poucos dias (eu mesmo já fiz isso).

E para arrebatar de vez, ele também suporta os devpacks, para configuração automática. :wink:

Agora me lembrei que o CString foi reimplementado no Visual Studio 2003 como sendo um template (CString = CStringT<char> ou CStringT<wchar_t> dependendo das opções de compilação, se ANSI ou Unicode); estou lendo o fonte do CString e depois lhe digo se tem ou não o lock. Eu tinha lido o fonte do CString do Visual Studio 6.0 e poderia lhe afirmar que o tal lock existe. Mas essa versão está deveras complicada pro meu gosto.

[quote=thingol]Agora me lembrei que o CString foi reimplementado no Visual Studio 2003 como sendo um template (CString = CStringT<char> ou CStringT<wchar_t> dependendo das opções de compilação, se ANSI ou Unicode); estou lendo o fonte do CString e depois lhe digo se tem ou não o lock. Eu tinha lido o fonte do CString do Visual Studio 6.0 e poderia lhe afirmar que o tal lock existe. Mas essa versão está deveras complicada pro meu gosto.

[/quote]

Thingol, eu só uso o CString do VS2005, que é o da ATL. Segundo as lendas (não achei o link), o CString da MFC, na MFC 8.0 é o mesmo da ATL, que é totalmente diferente na implementação do CString das MFCs anteriores.

Talvez por isso eu não tenha visto esses problemas que vocês mencionaram.

Pessoal… só pra esclarecer uma coisa… :smiley:

Hoje em dia, tem trabalho para programador em C++? Digo… tenho muitas dúvidas sobre C++, pensei em começar a usá-lo, mas fiquei cabreiro… porque, sei que a maioria dos programas grandes (Corel, Adobe e etc…) são feitos por C++. E só se vê C++ em visual studio e tals…

É só ele que presta pra fazer sistema “visual” pra windows?

Os outros que vi… pra criar uma tela… tinha que digitar quase umas 30 linhas… a praticidade foi pro saco… :roll:

[]s

[quote=titanius]Pessoal… só pra esclarecer uma coisa… :smiley:

Hoje em dia, tem trabalho para programador em C++? Digo… tenho muitas dúvidas sobre C++, pensei em começar a usá-lo, mas fiquei cabreiro… porque, sei que a maioria dos programas grandes (Corel, Adobe e etc…) são feitos por C++. E só se vê C++ em visual studio e tals…

É só ele que presta pra fazer sistema “visual” pra windows?

Os outros que vi… pra criar uma tela… tinha que digitar quase umas 30 linhas… a praticidade foi pro saco… :roll:

[]s[/quote]

basicamente é assim: se envolve computação gráfica é c++. Contudo, o mercado do Brasil é na imensa maioria para aplicações de banco de dados, onde o Java é mais forte.

Certo, mas aplicações feitas em C++, tendem a ser mais robusta, ou não?

[]s

Não necessariamente. Um programa é tão bom quanto o cara que o programou. Não é a linguagem que vai tornar um programa melhor ou pior - ela é apenas uma ferramenta. Um programa ruim pode ser feito em qualquer linguagem: Java com todos os frameworks do mundo, Ruby on Rails, Python, Smalltalk, Assembly Z80, etc.

Já vi provisionadores de comandos para telecoms feitos em TCL pela Ericsson!

Já vi tarifadores de pré-pago feitos em Java com Sybase…

E C++ tem essa fama de ser mais robusta porquê, no senso comum, é linguagem de “Cabra Macho da peste”. Mas, particularmente, acho que é porquê ela é difícil de aprender, e isso acaba afastando os programadores aventureiros e exigindo mais estudo e preparação para começar um programa. Diferente de, por exemplo, Visual Basic, onde qualquer um com um cursinho já saía vendendo softwares para os comerciantes do bairro.

Na indústria, sobretudo de tecnologia, há muito espaço para o C++. Esse mês mesmo, procuramos mais de 4 profissionais que conheçam C++. No meu setor, há mais de 30 colegas empregados para trabalhar nessa linguagem.

Também concordo com o tudo o que o LastClick falou a respeito do resto.