C ++ para desarrolladores de C #

24

Conozco C # bastante bien (autodidacta, lamentablemente) y necesito hacer algo de programación en C ++ para una aplicación de Windows. He podido encontrar un montón de información para los desarrolladores de C ++ que aprenden C #, pero no he podido encontrar mucha información sobre el aprendizaje de C ++ cuando ya conoces C #. ¿Alguien ha encontrado un buen resumen de lo básico?

MSDN tiene una comparación pero no es muy profunda.

Puedo juntar varias fuentes, pero pensé que había algo ahí afuera, simplemente no puedo encontrarlo. Gracias por tu ayuda.

Mark Williams
fuente
27
¿Por qué "tristemente"? No te desanimes así. No conozco un desarrollador de C # que no sea ​​autodidacta. Muchos de los cuales son desarrolladores increíbles .
Steven Evers
66
@SnOrfus, principalmente porque la academia lo evita por razones pseudopolíticas irracionales.
Rei Miyasaka
55
Mi primer consejo es no intentar aprender C ++ en el contexto de C #. Porque C # no es C ++ y C ++ no es C #. Esa podría ser una declaración estúpida, pero C # dificulta hacer mal los punteros, y es muy fácil hacerlo mal en C ++, incluso con las herramientas que lo hacen realmente fácil. Agregaría que hay muchas cosas que los dos idiomas tienen en común. Básicamente es como decir que una manzana y una naranja se cultivan en un árbol y tienen semillas y, por lo tanto, son frutas.
Ramhound
2
@ReiMiyasaka, no muy diferente de cómo los desarrolladores de C # miran VB .NET.
Kyralessa
1
@ Kyralessa, que también es un poco desafortunado. Creo que no es tanto un problema político como una condescendencia hacia la demografía VB.NET, porque la mayoría de los primeros usuarios de C # tienen antecedentes en C / C ++. Sin embargo, mi escuela utilizó VB.NET para cursos de principiantes. Parecen pensar que VB.NET es un juguete, por lo que no debería ser tan corruptora para la mente de los estudiantes como lo es C #.
Rei Miyasaka

Respuestas:

10

Este hilo en C ++ para desarrolladores de Java es muy similar y debería ser útil, especialmente la publicación de Mark Byer:

Lee estos libros:

Probablemente lo más importante a tener en cuenta es comprender la diferencia en las técnicas de administración de memoria entre C # / Java y C ++ .

Uno de mis profesores provenía de un entorno Java y enseñó un curso introductorio de C ++ pensando que sería un pastel. Nada de lo que explicó tenía sentido para nadie. Había tenido pérdidas de memoria por todas partes. Su puntero aritmético era terrible. Nunca llegó a la parte OOP del programa de estudios (gracias a Dios). Prácticamente nada de lo que demostró se habría compilado. No entendía que char[]necesitaba un centinela \0. No termines como él.

Rei Miyasaka
fuente
44
Lástima que nadie en C ++ use char[]entonces , ¿no?
DeadMG
55
@DeadMG No puedo entender tu punto. El hecho de que char[]rara vez se use en C ++ no significa que no se enseñe o que no se deba enseñar. char[]Todavía es importante tener en cuenta que C ++ es un superconjunto de C, y es imprescindible que se entienda correctamente para poder aprenderlo.
Rei Miyasaka
77
Sí, mucho, mucho tiempo después de que hayan dominado todos los demás aspectos del lenguaje. Prefiero enseñar a los nuevos estudiantes especializaciones parciales de plantillas y SFINAE. En C ++, usted usa std::string, y si tiene que interoperar con una API de C, entonces para eso c_str()está. No es necesario que el programador lidie con la char[]terminación NULL en nada de eso. El manejo de cadenas de estilo C es completamente y totalmente obsoleto para cada uso posible, excepto la interoperabilidad con el código C antiguo, que está perfectamente bien manejado c_str().
DeadMG
44
No hay tal cosa como enseñar char[]bien, porque todos los usos de char[]están mal. Su profesor probablemente habría sido absolutamente bien si hubiera pegado a C ++ en lugar de C
DeadMG
44
Usted va a ver el código C utiliza en C ++ si se escribe C o no a sí mismo, y en consecuencia, si estás aprendiendo C ++, es necesario aprender C. Como hemos dije, yo no lo apruebo, pero el hecho de la importa es que las escuelas enseñan generalmente C y luego virar en C ++ más tarde, porque los estudiantes necesitan aprender cosas como diseño de sistemas operativos - que, sin el BeOS y ciertos sistemas operativos de investigación, requieren absolutamente C. para ello, se hace necesario comprender cadenas de C. Nuevamente, por tercera vez, si me saliera con la mía, no enseñaría C ++ a los estudiantes de primer año, y por última vez, eso es completamente diferente.
Rei Miyasaka
14

Desafortunadamente, no hay mucho sobre C ++ que sea básico, por lo que no me haría ilusiones. Además, hay muy poco que sabrá sobre C # que sea incluso transferible de forma remota a C ++, por lo que no esperaría que exista ningún material específico que cubra ese ángulo. Tendrás que aprender desde cero.

DeadMG
fuente
3
Eso explicaría por qué no hay mucho por ahí. Después de leer C ++ un poco, parecería que estás en lo correcto: es un mundo totalmente diferente. Gracias por tu ayuda.
Mark Williams el
1
+1, hay poco que sabrás sobre C # que sea incluso transferible remotamente a C ++ . Aprendí esto de la manera difícil.
ApprenticeHacker
Como punto rápido, diría que hay un montón de C ++ que es básico. Distinguir punteros / referencias y plantillas de C ++ puede hacer que su cabeza gire al principio, pero cuando se trata de eso todavía hay clases couty formas simples de lograr objetivos simples
Kieren Johnstone
1
@KierenJohnstone: Probablemente te refieres a "formas lentas y no seguras de hacer cosas", como "decaimiento de matriz a puntero" y esas cosas.
DeadMG
12
Buena respuesta completamente inútil.
dbracey
9

No hay una solución fácil para esto, C ++ no es particularmente difícil, pero no es fácil para los principiantes.

Recomendaría leer los conceptos básicos de la programación en C (para obtener una base de las cosas de bajo nivel que encontrará), luego aprender el STL, seguido de artículos de la talla de Scott Meyers. Aquí hay uno para comenzar, ya que muestra cómo debería escribir C ++ moderno, en comparación con C-with-classes.

gbjbaanb
fuente
2
+1: agregaría obtener los libros de Meyer (serie C ++ / STL efectiva). Los tengo todos, y son increíbles.
Steven Evers
12
-1 para reading up on C programming. Creo que esto hace más daño que bien y confirma la noción de que C y C ++ son lenguajes que deben estudiarse juntos.
sebastiangeiger
2
@sebastiangeiger: pierde el punto de que cuando uno tiene que trabajar con aplicaciones C ++ existentes en el mundo real, tendrá que lidiar con construcciones tipo C. Por lo tanto, +1, al menos para eliminar tu voto negativo.
Doc Brown
55
@DocBrown Quizás, pero estoy en uno de esos proyectos heredados de C ++ en este momento y puedo decir que mis predecesores fueron en gran parte solo programadores en C que guardaron sus archivos fuente como * .cpp. Descubrí que estoy usando mucho menos deletey las matrices de C y otras cosas que se desaconsejan en C ++ de lo que lo hicieron, lo que atribuyo a NO estudiar explícitamente C. C es relativamente simple, puede descubrir muy rápidamente lo que hace el código.
sebastiangeiger
3
@gbjaanb: No hay nada, en absoluto, sobre el STL que requiera saber mallocy free. Un gran desarrollador de C ++ eventualmente querrá saber sobre ellos. Comenzar con ellos es algo completamente diferente.
DeadMG
7

No estoy seguro de si todavía está buscando materiales, encontré este artículo hace unos meses. No es un libro (solo 53 páginas). La introducción lo dice todo:

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

Y también hay una publicación de actualización también:

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

Feliz aprendizaje :)

Chris
fuente
Sin embargo, tenga mucho cuidado al usar este documento, ya que muestra C ++ de una manera muy centrada en Microsoft (también lo dice). No diferencia entre las características de C ++ 03 y C ++ 11, y a veces incluso muestra extensiones no estándar como la solución preferida. Terminarás con un código altamente inportable si sigues esa guía.
Fabio Fracassi
4
  • Esté atento a la gestión de la memoria. Obtenga una idea clara de cómo funcionan los punteros y las referencias en C ++ en contraste con C #. Además, RAII, gestión de memoria manual y punteros inteligentes por fin.
  • Las plantillas y los genéricos son similares pero son diferentes bestias. Conozca los aspectos internos de cómo funcionan las plantillas.
  • Hay algunas diferencias sintácticas pequeñas pero pegadizas. Aprendelos.
  • Te has acostumbrado a STL en lugar de .net BCL. Es posible que te pierdas algunas cosas buenas si tienes adicción a LINQ.
  • Existen algunas diferencias de diseño fundamentales entre C ++ y C #. Entonces, no puedes simplemente portar una idea. Cualquier cosa que construyas con C ++, tienes que diseñar desde cero.
  • Buena suerte
Gulshan
fuente
1

Creo que es bueno que no encuentres demasiados tutoriales de C # a C ++. Probablemente puedan confundir tu cerebro. Es muy parecido a tratar de aprender a conducir una motocicleta primero y luego cambiar a una bicicleta (no es una anología completamente apropiada, pero se entiende). Es mejor que tome un libro nuevo sobre C ++. Como ya está familiarizado con los conceptos de OOP, puede omitir las largas introducciones a los conceptos de OOP (están destinados a personas que migran de C a C ++). O diríjase directamente a un libro de referencia destinado a niveles de principiante a intermedio o intermedio.

DPD
fuente
1

Recomendaría ir a Rosetta Code y comparar los dos. Mientras esté allí, tenga a mano un enlace de expresiones idiomáticas de C ++ e intente detectarlas. Luego, pase un tiempo en el dominio puntero / referencia / memoria / destructor. Después de eso, aprenda sobre el preprocesador: realmente puede ser su amigo cuando se trata de ocultar a los feos, de alguna manera lo extraño. Finalmente, el STL.

marca
fuente
1

Entonces, hace aproximadamente un año, estaba en el mismo barco que usted: un autodidacta C # dev que sentía la necesidad de aprender C ++. Por supuesto, me detuve y comencé varias veces. En mi tercer intento, finalmente lo atravesé.

Lo que es imprescindible comprender es que, en términos de metodologías C ++ y C #, es probable que pase mucho tiempo entendiendo qué significan realmente los métodos de manipulación de datos a través de punteros y referencias , así como cuándo y cómo usarlos dadas las circunstancias.

Lo bueno de C ++ es que la asignación de la pila de objetos es bastante simple en su mayor parte, y debe asignar objetos de esta manera si su programa cumple con los requisitos especificados en este método. De lo contrario, dependerá de los punteros para obtener velocidad, eficiencia y limpieza rápida. Recomiendo leer esto: http://www.parashift.com/c++-faq-lite/ ya que le dará MUCHA comprensión técnica de cómo funciona C ++ bajo el capó.

Dejame darte un ejemplo:

En C ++ existe esta implementación de constructor conocida como "lista de inicialización", que difiere de inicializar miembros de clase en el cuerpo de un constructor. ¿Por qué? Porque a menos que el tipo que se inicialice sea primitivo, el compilador creará copias múltiples e innecesarias del objeto que se crea cuando se asigna en el cuerpo del ctor. Potencialmente, esto puede reducir el rendimiento, dependiendo del compilador y de los requisitos escalados de la aplicación.

¿Sabes qué es un delegado? Bueno, en C ++ se conoce como puntero de función . Este lenguaje es bastante difícil de dominar al principio, pero si quieres ser increíble ... definitivamente es obligatorio.

C # es fácil ... muy fácil.

sobre blanco
fuente
Los delegados de C # y los punteros de funciones de c son bastante diferentes. Un delegado está más cerca de un functor en C ++ que de un puntero de función.
CodesInChaos
-2

Créeme, elige un buen libro sobre C ++ (hay mucho más, solo haz una búsqueda) y comienza a aprender ...

Muhammad Hewedy
fuente
1
Por cierto, aprender algo de C antes (punteros, matrices, estructura) será bueno
Muhammad Hewedy
77
Aprender C antes que C ++ te devolverá a la edad de piedra. Hoy en día, rara vez utilizamos matrices y punteros en C ++. El lenguaje ha evolucionado lejos de ellos hace mucho tiempo.
fredoverflow
77
@ Muhammad: Todos los demás prefieren velocidad, seguridad, facilidad de mantenimiento.
DeadMG
3
@DPD: Bueno, muchos programadores profesionales de C ++, incluido Bjarne Stroustrup (el inventor del lenguaje), no están de acuerdo con usted. Su último libro enseña a usar objetos y plantillas desde el principio, mientras que las matrices y los punteros no se mencionan antes del Capítulo 17 (página 500 y algo así).
fredoverflow
2
@DeadMG. Tal vez, pero no puede revertir la evolución C-> C ++. Si odias la parte C de C ++, elige Java o C #. Personalmente, descubrí que concentrarme en punteros y matrices en C antes de ir a C ++ me ayudó mucho en mi carrera. Claro, puede codificar una aplicación completa sin ellos, pero si desea los beneficios del polimorfismo, necesita conocer los punteros. ¿Cuántos de los patrones GoF importantes se pueden implementar sin punteros? No era lo mismo para mis amigos que evitaban las partes "difíciles" cuando estudiaban C. A la mayoría de ellos les resultaba difícil entender el polimorfismo.
DPD