Pergunta

Preciso aprender C++ para aprender a construir o aplicativo Nokia WRT e/ou maemo.Preciso saber quais dicas e qual aspecto do C++ preciso/tenho que aprender ou focar mais.Uma coisa que tenho em mente é que C++ não tem coletor de lixo.Portanto, preciso me concentrar no tipo de variável.Mas, há algum outro que seja realmente importante e que não posso ignorar?

Foi útil?

Solução

A principal pegadinha é tentar imaginar o C++ em termos de como ele difere do PHP ou Java.

Desculpe, simplesmente não funciona assim.C++ difere dessas linguagens em quase todos os aspectos importantes além da sintaxe da aritmética.Às vezes as diferenças são sutis.Você precisa aprender do zero e não pensar que algo apropriado para fazer em PHP ou Java funcionará bem para você em C++.

Dito isto, as dificuldades comuns incluem:

  • gestão de recursos:RAII;implementando construtores de cópia, destruidores e operator=;evitando ter que implementar copy ctors, dtors, operator=.
  • entender o que são referências, ponteiros, valores e variáveis ​​automáticas.
  • evitando comportamento indefinido (myarray[i] = i++; é um favorito).PHP e Java são linguagens definidas de forma mais "firme" que C++:em primeiro lugar, é mais provável que o comportamento de um programa seja definido e, portanto, confiável.Por causa disso, implementações separadas são mais semelhantes que implementações C++.É muito fácil escrever um programa em C++ que não apenas faça a coisa errada, mas também faça coisas totalmente diferentes em execuções diferentes, incluindo travamento, corrupção de dados, etc.
  • aprendendo a usar modelos de forma segura e eficaz, herança múltipla, sobrecarga de operador e outros recursos com os quais você não está familiarizado.
  • expressões corretas para lançar e capturar exceções (lançar por valor, capturar por referência, não descartar um destruidor).
  • escrever código portátil (entendendo a diferença entre o que o padrão garante e o que não é garantido, mas que sua implementação faz.comportamento definido pela implementação, como os tamanhos dos tipos fundamentais).
  • As bibliotecas padrão do C++ são limitadas em comparação com Java ou PHP.Você também usará bibliotecas não padrão.Por exemplo, Maemo usa GTK+ e/ou Qt.Freqüentemente, a resposta para "como posso fazer X em C++" é: "você não pode fazer isso usando apenas C++ padrão, você precisa de APIs específicas da plataforma ou de uma biblioteca portátil compilada para o seu sistema".X pode ser gráficos, soquetes, expressões regulares, multithreading, manipulação de XML, criptografia.Especialmente com plataformas móveis, você precisa ficar de olho nas versões do sistema operacional, pois as coisas podem e irão mudar de tempos em tempos.

Outras dicas

Aprenda a usar contêineres STL imediatamente. Embora a sintaxe do iterador não seja amigável para as pessoas provenientes de outros idiomas, ela oferece as estruturas de dados incorporadas que você geralmente usa nas coleções de Java ou PHP como construído (mapas/hashes, listas, pilhas, vetores) sem escrever código de ponteiro descolado com alocação dinâmica que tantas vezes desviam iniciantes para reinventar a roda e mexer com erros de memória.

Além disso, se você escrever código específico da plataforma (um aplicativo QT ou Microsoft MFC, por exemplo), geralmente verá exemplos usando contêineres específicos da estrutura, onde o STL seria uma opção mais sábia. STL (e Boost) pode preencher lacunas. O uso de uma estrutura da GUI não significa que você precisa usar tudo o que a estrutura oferece. Fique longe de contêineres fora do padrão, a menos que saiba, sem sombra de dúvida, nunca portará o programa ou reutiliza partes do código.

Eu diria que não é do tipo variável, mas certificando -se de limpar sua memória. Java limpará sua memória, mas o C ++ não fará isso por você. Caso contrário, é importante gerenciar seus recursos na presença de exceções.

No lado positivo, você conseguirá o que eles chamam de "Finalização determinística". Enorme benefício. Olhe para cima, como um acrônimo, "Raii". Eu acho que é sem dúvida um dos idiomas mais importantes do C ++.

Significa "aquisição de recursos é inicialização", mas o que realmente significa é "quando esse destruidor dispara, vou limpar depois de você, mesmo na presença de exceções". Na prática, significa que qualquer objeto que você criar ou abrir, que você precisa fechar ou excluir, pode segurar usando um ponteiro inteligente. O ponteiro inteligente vai limpar depois de você. Isso é muito, muito poderoso quando você o entende e começa a usá -lo. Torna sua verificação de erros, manuseio de exceção e código de limpeza de recursos muito simples.

Uma dica que vi alguns programadores Java fazerem quando a transição para C++ é "try-catch" de vazamentos de memória.Por exemplo:

try {
  myType pVar = new myType();
  DoSomething(pVar);
  delete pVar;
}
catch (exception) {
  cout << "Doh!  Something failed!" << endl;
}

No caso acima, se o método "DoSomething() lançar uma exceção, o pVar nunca seria excluído, portanto haveria um vazamento de memória.

(As soluções para isso incluem:declarando todas as variáveis ​​antes dos blocos try/catch, usando auto_ptr, ou apenas evitando try-catch para começar!)

O mais importante (na minha opinião) é que tudo é um tipo de valor; portanto, se você passar uma matriz em uma função como esta:

void do_stuff(std::vector<int> my_array)
{
  ...
}

então o my_array que é passado é um cópia de do argumento especificado. Copiar uma matriz inteira como essa é cara, então, em geral, você deseja passar por const-referência:

void do_stuff(const std::vector<int>& my_array) 
{
  ...
}

(Nota: omitir o const Se você deseja modificar o original my_array).

Estou curioso para saber por que 'Php/Java' é considerado uma única coisa aqui. Não é.

  • A transição Java-> C ++ é bastante grande, mas é factível, você só precisa aprender muita sintaxe extra, alguns conceitos extras, como destruidores, construtores de copiadores, fatiamento de objetos e sobrecarga do operador e aceitará a biblioteca C ++ .
  • A transição php-> c ++, por outro lado, é outra ordem de magnitude maior, pois diz respeito a (a) uma linguagem de origem muito mal definida, (b) uma linguagem que é baseada em modelo em vez de baseada em classe e (c ) um idioma que é executado em um ambiente especial.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top