C++ como primer lenguaje [closed]

10 minutos de lectura

He estado autoaprendiendo C ++ durante aproximadamente 4 meses. Lo estoy disfrutando, y creo que lo estoy haciendo bastante bien. Sin embargo, una respuesta a una pregunta mía me hizo pensar que podría estar preparándome para una caída.

Entonces, ¿qué piensa la gente aquí sobre C++ como primer idioma para aprender? ¿Y vale la pena continuar ahora que he tenido un buen comienzo?

Déjame ponerlo de esta manera:

Tomé y aprobé con un 94% la Certificación Sun Java sin haber compilado nunca una línea de Java (Eso fue hace nueve años). Pude hacer esto porque conocía muy bien C++.

En mi primer trabajo profesional, me contrataron como probador. En mi segundo día, me dijeron que podía programar en lugar de probar, si aprendía suficiente PowerBuilder para ser útil, en dos semanas. Como conocía muy bien C++, PowerBuilder fue fácil.

C++ es difícilpero si lo aprendes bien, lee el texto de Stroustrup El lenguaje de programación C++haz los ejercicios también, lee su Diseño y Evolución de C++lea las preguntas frecuentes de C++ y los libros de Meyers y los libros de Herb Sutter, lea comp.lang.c++.moderated, lea los libros de Coplien Modismos y estilos de programación avanzados en C++ no importa en qué lenguaje OO quieras codificar; si lo aprendes bien, todos los demás lenguajes OO son fáciles.

Aprender C++ es una excelente preparación para aprender a programar. (Y también se convertirá en un buen programador de C, pero lea K&R para convertirse en un buen programador de C).

Vaya. Y es muy divertido programar en C++, mucho menos detallado que Java y mucho más flexible. Usted está realmente a cargo, no el IDE o el idioma. Puedes dispararte con tu propio pie, pero tú estarás a cargo de hacerlo. Y lea el libro de Alexandrescu una vez que conozca las plantillas, lo sorprenderá, lo dejará estupefacto y lo deleitará.

C++ es divertida. Lea el “Patrón de plantilla curiosamente recurrente”: se ve así

template< class  T> struct base {};

struct derived: base< derived > {};

Sí, lo entendiste bien: es una clase que se deriva de una base que tiene una plantilla en la clase derivada. Ahora, eso suena oscuro y tonto, pero tiene muchos buenos usos, y el otro día me estaba golpeando la cabeza porque no puedes hacer esto en Java (porque Java usa borrado de tipos, no plantillas, para genéricos), pero si hubiera podido usarlo, podría haber guardado montones y montones de código repetido en muchas clases.

Hay mucho más en C++, y si te limitas a Java o .Net, nunca lo descubrirás.

  • +1 por el fabuloso chorro 🙂 Me encantó aprender C ++ y tuve la suerte de dominar aspectos de él cuando trabajé con él durante 5 años más o menos. Sigue siendo mi idioma “favorito” aunque ya casi no lo uso.

    – Preocupado binario

    3 de abril de 2009 a las 13:46

  • “si lo aprendes bien, todos los demás idiomas orientados a objetos son fáciles”. Siento disentir. Lo que quiere decir es que “cualquier otro lenguaje OO de estilo C ++ es fácil”.

    – Svante

    3 abr 2009 a las 21:21

  • There's so much more in C++, and if you limit yourself to Java or .Net, you'll never discover it. exactamente. +1 solo por esa frase.

    – v.oddou

    13 de septiembre de 2013 a las 1:51

  • “Programación: principios y práctica usando C++” de Stroustrup también es bueno. Cuestiono el libro de van der Linden: si bien es un libro excelente para programar en C, no creo que sea útil para C++.

    –David Thornley

    3 de abril de 2009 a las 14:26

  • De hecho, creo que el libro de van der Linden es muy útil para los programadores de C++. Contiene algunas de las mejores descripciones de cómo funcionan realmente los punteros y la gestión de la memoria. Básicamente, contiene todas las cosas esenciales que se supone que C ++ debe ocultar pero nunca puede;)

    – D. Shawley

    4 de abril de 2009 a las 2:47

Mucho soporte para c ++ aquí, pero tengo que estar en desacuerdo. Cada idioma tiene sus pros y sus contras (algunos logran un mejor equilibrio que otros, por supuesto).

Dicho esto, para un primer idioma, estoy convencido de que la mayoría de la gente aprenderá como programar más efectivamente con un lenguaje que a) no tiene un ciclo de edición-compilación-ejecución (que es inherentemente más lento para usted como programador b) tiene recolección de basura c) tiene una buena introspección en tiempo de ejecución. Lo mejor es que también haya un evaluador interactivo con el que jugar.

El desarrollo (si no el tiempo de ejecución) es casi invariablemente más rápido en tales lenguajes, hay menos cosas que lo hacen tropezar y hay mejores herramientas para ayudar a determinar qué salió mal cuando lo hizo.

Lo que no quiere decir que aprender los caprichos de la gestión de la memoria en un lenguaje como c++ no sea algo que valga la pena, etc., etc., simplemente no es el lugar por el que realmente quieres empezar.

Otro problema con c ++ es que, a pesar de su practicidad, el gran tamaño se sumó al hecho de que tiene partes incompatibles que pueden generar problemas sutiles que es mejor evitar como principiante.

editado: John D plantea el punto en un comentario de que algunas personas que aprenden primero en un lenguaje GC’d (que de ninguna manera se limita a los lenguajes de “scripting”) nunca aprenden punteros más tarde. Sin embargo, esto es una pista falsa. Algunas personas no logran aprender todo tipo de cosas, por todo tipo de razones. Sostengo que preocuparse por los punteros es una distracción cuando estás aprendiendo lo básico. En algún momento, es posible que necesite aprender sobre la gestión manual de la memoria, pero no es fundamentalmente importante hacer esto al principio. O más exactamente, las ganancias obtenidas al evitar esto son más importantes que los costos.

Sin embargo, permítanme ser claro, no estoy diciendo que c ++ sea una opción inferior para un primer idioma porque carece de recolección de basura. Ese es solo uno de los muchos problemas que se interponen en el camino de aprender bien los fundamentos de la programación. El verdadero problema es que es un lenguaje grande y complicado, con peculiaridades por todas partes e incluso inconsistencias internas (por ejemplo, los punteros y las excepciones no funcionan bien juntos). Por supuesto, todo esto se puede gestionar adecuadamente y puede aprender buenas prácticas para evitar meterse en problemas.

Sin embargo, nada de esto tendrá mucho sentido para un verdadero neófito al principio. Entonces, parte del aprendizaje terminará siendo “hazlo de esta manera, no de esa manera”. “¿por qué?” “porque yo lo digo — aún no entenderás los detalles”. Difícilmente un comienzo auspicioso.

Sin embargo, las mayores ganancias para aprender un primer idioma son probablemente evitar un ciclo de edición-compilación-ejecución (de cualquier tipo) y tener una buena introspección.

  • Discrepar. Por ejemplo, muchos programadores que conozco que aprendieron a programar en un lenguaje GC-ed luego vienen a C ++ y nunca realmente “obtienen” punteros, y creen que los punteros no son realmente una “parte” de la programación y los ignoran como algo que nunca tiene que averiguar Script kiddies para siempre.

    – John Dibling

    3 de abril de 2009 a las 15:03

  • Empecé a estar de acuerdo, pero me perdiste con lo de la recolección de basura. Para un principiante, la asignación de montón nunca debería surgir en primer lugar. Si es así, prefiero que sea lo más explícito posible, para que empiecen a tener que pensar en ello cuando lo hacen.

    – TED

    3 abr 2009 a las 15:45

  • Ted, creo que estamos en la misma página. No deberías tener que pensar en ello al principio.

    – Simón

    3 de abril de 2009 a las 17:26

  • Bueno, lo que quiero decir es que el problema de C++ no es la falta de GC para todas sus asignaciones de almacenamiento dinámico, es que tienes que hacer muchas de ellas en primer lugar. Por ejemplo, ¿por qué no puedo dimensionar una matriz que estoy declarando con los resultados de una llamada de función? ¿Por qué es tan común pasar punteros?

    – TED

    3 abr 2009 a las 22:58

  • @ted. correcto, que era mi punto de vista acerca de que GC no es el escollo, solo uno de muchos problemas. Tal vez te entendí mal y realmente estás diciendo que no te gusta GC para novatos, pero tampoco te gusta manejarlo manualmente. En cuyo caso no estoy de acuerdo, pero levemente.

    – Simón

    7 de abril de 2009 a las 13:14

C++ será (¿mucho?) más accesible si aprende “C++ moderno” en lugar de “C más algunas cosas nuevas”. Por ejemplo, use std::string, std::vector<>y unique_ptr<> / shared_ptr<> en su lugar, cadenas, matrices y punteros de estilo C.

El ya mencionado C++ acelerado por Koenig y Moo es un libro que hace exactamente esto.

  • Discrepar. Por ejemplo, muchos programadores que conozco que aprendieron a programar en un lenguaje GC-ed luego vienen a C ++ y nunca realmente “obtienen” punteros, y creen que los punteros no son realmente una “parte” de la programación y los ignoran como algo que nunca tiene que averiguar Script kiddies para siempre.

    – John Dibling

    3 de abril de 2009 a las 15:03

  • Empecé a estar de acuerdo, pero me perdiste con lo de la recolección de basura. Para un principiante, la asignación de montón nunca debería surgir en primer lugar. Si es así, prefiero que sea lo más explícito posible, para que empiecen a tener que pensar en ello cuando lo hacen.

    – TED

    3 abr 2009 a las 15:45

  • Ted, creo que estamos en la misma página. No deberías tener que pensar en ello al principio.

    – Simón

    3 de abril de 2009 a las 17:26

  • Bueno, lo que quiero decir es que el problema de C++ no es la falta de GC para todas sus asignaciones de almacenamiento dinámico, es que tienes que hacer muchas de ellas en primer lugar. Por ejemplo, ¿por qué no puedo dimensionar una matriz que estoy declarando con los resultados de una llamada de función? ¿Por qué es tan común pasar punteros?

    – TED

    3 abr 2009 a las 22:58

  • @ted. correcto, que era mi punto de vista acerca de que GC no es el escollo, solo uno de muchos problemas. Tal vez te entendí mal y realmente estás diciendo que no te gusta GC para novatos, pero tampoco te gusta manejarlo manualmente. En cuyo caso no estoy de acuerdo, pero levemente.

    – Simón

    7 de abril de 2009 a las 13:14

C ++ como primer idioma puede estar bien si tiene un buen maestro. Pero es una pared bastante alta para escalar por primera vez, pero una vez que escalas esa pared, otros lenguajes similares son muy fáciles.

Así que sí, continúa.

¿Ha sido útil esta solución?