C ++ para desenvolvedores de C #

24

Conheço C # muito bem (autodidata, infelizmente) e preciso fazer alguma programação em C ++ para um aplicativo do Windows. Consegui encontrar uma tonelada de informações para desenvolvedores de C ++ que aprendem C #, mas não consegui encontrar muita informação sobre como aprender C ++ quando você já conhece C #. Alguém já se deparou com um bom resumo do básico?

O MSDN tem uma comparação, mas não é muito aprofundada.

Posso reunir várias fontes, mas achei que havia algo lá fora - simplesmente não consigo encontrá-lo. Obrigado pela ajuda.

Mark Williams
fonte
27
Por que "infelizmente"? Não se ponha assim. Não conheço um desenvolvedor de C # que não seja autodidata. Muitos dos quais são desenvolvedores incríveis .
Steven Evers
6
@SnOrfus - principalmente porque a academia evita isso por razões pseudo-políticas irracionais.
Rei Miyasaka
5
Minha primeira palavra de conselho é não tentar aprender C ++ no contexto de C #. Porque C # não é C ++ e C ++ não é C #. Pode ser uma afirmação estúpida de se fazer, mas o C # dificulta a execução de indicadores errados, e é muito fácil executá-los incorretamente no C ++, mesmo com as ferramentas que o tornam realmente fácil. Eu acrescentaria que há muitas coisas que os dois idiomas compartilham em comum. É basicamente como dizer que uma maçã e uma laranja crescem em uma árvore e têm sementes e, portanto, são frutos.
Ramhound 4/12/12
2
@ReiMiyasaka, não muito diferente de como os desenvolvedores de C # veem o VB .NET.
precisa saber é o seguinte
11
@ Kyralessa O que também é meio infeliz. Eu acho que não é tanto uma questão política, mas uma condescendência com a demografia do VB.NET - porque a maioria dos primeiros usuários do C # tem experiência em C / C ++. Minha escola usou o VB.NET para cursos para iniciantes. Eles parecem pensar que o VB.NET é um brinquedo e, portanto, não deve ser tão corrompedor para as mentes dos alunos quanto o C #.
Rei Miyasaka

Respostas:

10

Este tópico sobre desenvolvedores de C ++ para Java é muito semelhante e deve ser útil, especialmente na publicação de Mark Byer:

Leia estes livros:

Provavelmente, o mais importante a ser lembrado é entender a diferença nas técnicas de gerenciamento de memória entre C # / Java e C ++ .

Um dos meus professores veio de Java e ministrou um curso introdutório de C ++, pensando que seria ótimo. Nada do que ele explicou fazia sentido para alguém. Ele teve vazamentos de memória por toda parte. A aritmética do ponteiro dele era terrível. Ele nunca chegou à parte OOP do currículo (graças a Deus). Praticamente nada que ele demonstrasse teria compilado. Ele não entendeu que char[]precisava de um sentinela \0. Não termine como ele.

Rei Miyasaka
fonte
4
Pena que ninguém em C ++ use char[]então , não é?
DeadMG
5
@DeadMG Não consigo entender bem o seu ponto. Só porque char[]raramente é usado em C ++ não significa que não é ensinado ou que não deve ser ensinado. char[]ainda é importante estar ciente, porque C ++ é um superconjunto de C e é imperativo que ele seja entendido corretamente, se é para ser aprendido.
Rei Miyasaka
7
Sim, muito, muito, muito tempo depois que eles dominam todos os outros aspectos da linguagem. Prefiro ensinar aos novos alunos especializações parciais de modelos e SFINAE. No C ++, você usa std::stringe, se precisar interoperar com uma API C, c_str()é para isso que serve. Não é necessário que o programador lide com a char[]terminação NULL ou nada disso. O manuseio de string no estilo C é total e totalmente e totalmente obsoleto para todos os usos possíveis, exceto a interoperabilidade com o código C antigo, que é perfeitamente bem tratado c_str().
DeadMG
4
Não existe ensino char[]certo, porque todos os usos de char[]estão errados. Seu professor provavelmente teria sido absolutamente bem se tivesse preso a C ++ em vez de C.
DeadMG
4
Você vai ver o código C usado em C ++ se você escrever C ou não a si mesmo, e, conseqüentemente, se você está aprendendo C ++, você precisa aprender C. Como eu disse, eu não toleramos isso, mas o fato da importa é que as escolas geralmente ensinam C e, em seguida, orçada em C ++ depois, porque os alunos precisam ser ensinados coisas como design OS - que, excluindo BeOS e certos sistemas operacionais de pesquisa, requerem absolutamente C. para isso, você fazer necessidade de compreender strings C. Novamente, pela terceira vez, se eu pudesse, não ensinaria C ++ a todos os alunos do primeiro ano e, pela última vez, isso está além do ponto.
Rei Miyasaka
14

Infelizmente, não há muito sobre C ++ que seja básico, então eu não teria muitas esperanças. Além disso, há pouco que você saberá sobre C # que é transferível remotamente para C ++, então eu não esperaria que existisse material específico cobrindo esse ângulo. Você precisará aprender do zero.

DeadMG
fonte
3
Isso explicaria por que não há muito por aí. Depois de ler um pouco sobre C ++, parece que você está correto - é um mundo totalmente diferente. Obrigado pela ajuda.
Mark Williams
11
+1, há pouco que você saberá sobre C # que pode ser transferido remotamente para C ++ . Eu aprendi isso da maneira mais difícil.
ApprenticeHacker
Como ponto rápido, eu diria que há bastante C ++ básico. Distinguindo ponteiros / referências e modelos C ++ pode fazer girar a cabeça no início, mas quando se trata baixo para ele ainda há classes, coute maneiras simples para alcançar objetivos simples
Kieren Johnstone
11
@KierenJohnstone: Você provavelmente quer dizer "maneiras lentas e inseguras de fazer coisas", como "decaimento do array para ponteiro" e coisas assim.
DeadMG
12
Boa resposta completamente inútil.
dbracey
9

Não há uma solução fácil para isso, o C ++ não é particularmente difícil, mas não é fácil para iniciantes.

Eu recomendaria ler o básico da programação C (para obter um conhecimento básico das coisas de baixo nível que você encontrará) e depois aprender o STL, seguido de artigos de Scott Meyers. Aqui está uma para você começar, pois mostra como você deve escrever C ++ moderno, comparado com C-com-classes.

gbjbaanb
fonte
2
+1: eu adicionaria a obtenção dos livros de Meyer (série C ++ / STL efetiva). Eu tenho todos eles, e eles são incríveis.
Steven Evers
12
-1 para reading up on C programming. Eu acho que isso faz mais mal do que bem e cobre a noção de que C e C ++ são linguagens que precisam ser estudadas em conjunto.
precisa
2
@sebastiangeiger: você perde o ponto de que quando alguém tem que trabalhar com aplicativos C ++ existentes no mundo real, muitas vezes precisará lidar com construções do tipo C. Portanto, +1, pelo menos para eliminar seu voto negativo.
Doc Brown
5
@DocBrown Talvez, mas agora estou em um desses projetos herdados de C ++ e posso dizer que meus predecessores eram em grande parte apenas programadores em C que salvavam seus arquivos de origem como * .cpp. Descobri que estou usando muito menos deletearrays C e outras coisas que são desencorajadas em C ++ do que eles, que eu atribuo ao NÃO estudar explicitamente C. C é relativamente simples, você pode descobrir rapidamente o que o código faz.
precisa
3
@gbjaanb: Não há nada sobre o STL que exija conhecimento malloce free. Um ótimo desenvolvedor de C ++ acabará desejando saber sobre eles. Começando com eles é uma coisa totalmente diferente.
DeadMG
7

Não tenho certeza se você ainda está procurando materiais, encontrei este artigo há alguns meses. Não é um livro (apenas 53 páginas). A introdução diz tudo:

This is a somewhat short guide to the important things to know if you are a C# programmer and find yourself needing or wanting to work in C++

http://geekswithblogs.net/mikebmcl/archive/2012/02/02/c-to-c-ndash-a-somewhat-short-guide.aspx

E também há um post de atualização:

http://geekswithblogs.net/mikebmcl/archive/2012/02/14/c-to-cndasha-somewhat-short-guide-update-1.aspx

Feliz aprendizado :)

Chris
fonte
Tenha muito cuidado ao usar este documento, porém, ele mostra C ++ de uma maneira muito centrada na Microsoft (também o diz). Ele não diferencia entre os recursos C ++ 03 e C ++ 11 e, às vezes, até mostra extensões não padrão como a solução preferida. Você terminará com código altamente não portável se seguir esse guia.
Fabio Fracassi
4
  • Procure gerenciamento de memória. Tenha uma idéia clara de como os ponteiros e referências funcionam em C ++, em contraste com o C #. Além disso, RAII, gerenciamento manual de memória e ponteiros inteligentes, finalmente.
  • Modelos e genéricos são semelhantes, mas são bestas diferentes. Conheça os aspectos internos de como os modelos funcionam.
  • Existem algumas diferenças sintáticas minúsculas, mas cativantes. Aprenda-os.
  • Você se acostumou ao STL em vez do .net BCL. Você pode perder algumas partes boas se tiver vício em LINQ.
  • Há alguma diferença fundamental de design entre C ++ e C #. Portanto, você não pode simplesmente portar uma ideia. Qualquer coisa que você construa com C ++, você precisa projetar do zero.
  • Boa sorte
Gulshan
fonte
1

Eu acho que é bom que você não encontre muitos tutoriais de C # para C ++. Eles provavelmente podem atrapalhar seu cérebro. É como tentar aprender a andar de moto primeiro e depois mudar para uma bicicleta (não uma anologia totalmente apropriada, mas você entendeu). É melhor você fazer um livro novo sobre C ++. Como você já está familiarizado com os conceitos de POO, você pode pular as longas introduções aos conceitos de POO (elas são destinadas a pessoas que migram de C para C ++). Ou vá diretamente para um livro de referência destinado a níveis iniciantes a intermediários ou intermediários.

DPD
fonte
1

Eu recomendaria ir ao Código Rosetta e comparar os dois. Enquanto você estiver lá, mantenha à mão um link de idiomas C ++ e tente identificá-los. Depois, dedique algum tempo ao domínio ponteiro / referência / memória / destruidor. Depois disso, aprenda sobre o pré-processador - ele pode realmente ser seu amigo quando se trata de esconder os feios, eu meio que sinto falta. Finalmente, o STL.

Marca
fonte
1

Então, cerca de um ano atrás, eu estava no mesmo barco que você: aprendi c # dev que sentiu a necessidade de aprender C ++. Concedido, parei e comecei várias vezes. Na minha terceira tentativa, finalmente consegui.

O que é essencial entender é que, em termos de metodologias C ++ e C #, você provavelmente gastará muito tempo entendendo quais métodos de manipulação de dados por meio de ponteiros e referências realmente significam, bem como quando e como usá-los, dadas as circunstâncias.

O bom do C ++ é que a alocação da pilha de objetos é bastante simples, e você deve alocar objetos dessa maneira se o seu programa atender aos requisitos especificados neste método. Caso contrário, você depende de indicadores para velocidade, eficiência e limpeza rápida. Eu recomendo a leitura: http://www.parashift.com/c++-faq-lite/ , pois fornecerá MUITO conhecimento técnico sobre como o C ++ funciona sob o capô.

Deixe-me lhe dar um exemplo:

No C ++, existe essa implementação de construtor conhecida como "lista de inicialização", que difere da inicialização de membros da classe no corpo de um construtor. Por quê? Porque, a menos que o tipo que está sendo inicializado seja primitivo, o compilador criará cópias múltiplas e desnecessárias do objeto que está sendo criado quando alocado no corpo do ctor. Isso pode potencialmente reduzir o desempenho, dependendo do compilador, bem como dos requisitos em escala do aplicativo.

Sabe o que é um delegado? Bem, em C ++ é conhecido como um ponteiro de função . No início, esse idioma é bastante difícil de dominar, mas se você quiser ser incrível ... é definitivamente necessário.

C # é fácil ... muito fácil.

sobre em branco
fonte
Os representantes de C # e os ponteiros de função c são bem diferentes. Um delegado está mais próximo de um functor em C ++ do que de um ponteiro de função.
CodesInChaos
-2

Acredite, escolha um bom livro sobre C ++ (há muito mais, basta pesquisar) e comece a aprender ...

Muhammad Hewedy
fonte
11
BTW, aprender alguma C antes (ponteiros, matrizes, struct) vai ser bom
Muhammad Hewedy
7
Aprender C antes do C ++ o levará de volta à idade da pedra. Atualmente, raramente usamos matrizes e ponteiros em C ++. A linguagem evoluiu para longe deles há muito tempo.
Fredoverflow
7
@ Muhammad: Todos os outros preferem velocidade, segurança e facilidade de manutenção.
DeadMG
3
@DPD: Bem, muitos programadores profissionais de C ++, incluindo Bjarne Stroustrup (o inventor da linguagem), discordam de você. Seu último livro ensina o uso de objetos e modelos desde o início, enquanto matrizes e ponteiros não são mencionados antes do Capítulo 17 (página 500 e algo assim).
Fredoverflow
2
@DeadMG. Talvez, mas você não pode reverter a evolução C-> C ++. Se você odeia a parte C do C ++, vá para Java ou C #. Pessoalmente, descobri que me concentrar em ponteiros e matrizes em C antes de ir para C ++ me ajudou bastante em minha carreira. Claro, você pode codificar um aplicativo inteiro sem eles, mas se quiser os benefícios do polimorfismo, precisará conhecer os ponteiros. Quantos dos padrões importantes do GoF podem ser implementados sem ponteiros? Não era o mesmo para meus amigos que evitavam as partes "duras" quando estudavam C. A maioria deles achou difícil entender o polimorfismo.
DPD