Dado que C ++ '11 fue aprobado, ¿esto cambia la forma en que un principiante de C ++ aprende el lenguaje? [cerrado]

21

Quería aprender C ++ por un tiempo y tomé la programación de computadoras AP en la escuela secundaria (cuando era C ++ y no Java). Disfruto de C y simplemente no he encontrado el tiempo para aprender C ++ o simplemente recurriré a C # donde soy mucho más productivo.

Mi pregunta es la siguiente: dado que C ++ '11 ha sido aprobado (aunque sé que no está completamente implementado), ¿esto cambia la forma en que debo abordar el aprendizaje de C ++? Soy dueño de C ++: The Complete Reference By Herb Schildt, que es de 1998. ¿El estándar recientemente aprobado hace que aprender de tales libros sea menos importante que algunos de los tutoriales / libros más nuevos que incluyen cosas del estándar? ¿Hay algún beneficio en aprender de los libros más antiguos?

Jetti
fuente
99
Oof Schildt. No puedo hablar de la calidad de sus materiales C ++, pero sus materiales C estuvieron por debajo del estándar durante mucho tiempo (incluso la última edición de C: TCR todavía tiene algunos errores no triviales). Recomiendo buscar un trabajo más actual de otro autor.
John Bode
C ++ 11 no cambió los conceptos básicos de C ++, que deben aprenderse para hacer cualquier cosa que se haya introducido en la última revisión y que no exista en una versión anterior de C ++.
Ramhound
11
Nunca confíes en un libro de Herb Schildt. Realmente, si bien la mayoría de los libros de C ++ son malos (y no me refiero a cuestiones estilísticas aquí, sino a errores de hechos evidentes y a promover estilos de programación conocidos por conducir a códigos defectuosos), los libros de Schildt han sido extraordinariamente malos, su nombre se convirtió en un meme.
sbi
44
@Ramhound: No estoy de acuerdo. Si eso fuera cierto, todos aprenderíamos primero la gestión manual de recursos, y solo entonces, las formas más seguras de hacer recursos dinámicos. Afortunadamente, esto está cambiando (lentamente). Nuevas posibilidades, incluso si están "solo" en la biblioteca, requieren nuevas expresiones idiomáticas. Si comienzas con un idioma, ¿por qué aprender modismos antiguos primero, solo para tener que desaprenderlos después?
sbi

Respuestas:

16

Absolutamente. En estos días, tres cosas que generalmente se encuentran en la lección 2 deberían avanzar mucho, mucho más tarde:

  • cadenas como matrices de char *, los métodos strlen, strxxx, etc.
  • matrices en general y aritmética de puntero
  • borra lo nuevo, borra [] lo nuevo [] e incluso destructores

Estas cosas que usualmente están en la lección 99 deberían moverse mucho, mucho antes

  • plantillas como cosas para usar (escribir, no tanto)
  • std :: string
  • std :: shared_ptr <>
  • std :: vector <>, iteradores, otras colecciones

Cada puntero sin formato debe asignarse inmediatamente a un contenedor de puntero inteligente (comenzaría por compartido, y lo consideraría único más adelante, ya que requiere explicar las referencias std :: move y rvalue). Hacer esto hará que aprender C ++ se parezca mucho a aprender Java o C #, donde aprendes la biblioteca al mismo tiempo que el lenguaje. También eliminará gran parte del trabajo de memoria y dejará a las personas menos preocupadas por las trampas.

También trabajaría lambdas en la imagen la primera vez que quisiéramos recorrer una colección y hacer algo con cada elemento.

Descargo de responsabilidad: estoy escribiendo un curso de C ++ para Pluralsight en este momento y estoy utilizando este enfoque. El último módulo es "comprender el código de otras personas" y ahí es donde pondré las cosas confusas como las cadenas char *, la gestión manual de la memoria, la aritmética del puntero, etc.

Actualización: algunas personas han preguntado por qué la existencia de C ++ 0x inspira la enseñanza de cosas que podrían haberse enseñado con C ++ 03. Creo que es una serie de cosas:

  • Los punteros verdaderamente inteligentes, que son fáciles de recopilar, eliminan la necesidad de cosas como "una serie de punteros de empleados" que nos hacían recurrir siempre a nuevos / eliminar, aritmética de punteros, etc.
  • auto elimina el dolor de las declaraciones de iterador
  • Las lambdas hacen que la predicación sea algo que una persona común haría
  • incluso algo tan trivial como analizar >>correctamente elimina el problema que estaría allí al declarar algunas plantillas de plantillas
  • y así

Desde mi punto de vista, hay cosas que podríamos haber cambiado sobre la forma en que enseñábamos C ++ hace algún tiempo, pero algunos de nosotros nos reprimimos porque todavía necesitábamos el estilo de la vieja escuela para un retroceso o porque enseñarlo implicaba mucho del conocimiento arcano.

Kate Gregory
fuente
3
¿Por qué cree que la gestión manual de la memoria debería enseñarse más tarde? Creo que es importante saberlo y da más aprecio al aprender punteros inteligentes. He tenido que aprender administración de memoria (y matrices de caracteres) en C y me ha hecho apreciar RAII y std :: string mucho más de lo que creo que lo hubiera hecho si no hubiera tenido que hacerlo.
Jetti
1
Sus ejemplos se aplican principalmente a C ++ 98 frente a C ++ preestándar, no a C ++ 03 frente a C ++ 11. Supongo que dado lambda, std::for_each()será mucho más popular de lo que solía ser, autoserá muy importante, y la nueva sintaxis de declaración de función (junto con decltype) se utilizará bastante en el código de plantilla. Esas son cosas que ningún libro actual de C ++ enseña. Pero sí, en general estoy de acuerdo contigo ( +1). Cuando comencé a dar cursos de C ++, comencé con C ++ acelerado , y aunque mi curso comenzó a desviarse cada vez más de él, sigue siendo fiel al principio subyacente.
sbi
3
@Jetti: Raramente hago gestión manual de recursos, y si lo hago, es para implementar clases RAII. Sin embargo, uso muchas de esas clases. Según eso, el uso de material RAII parece más importante que el manejo de recursos en bruto y, por lo tanto, debería enseñarse antes, con más énfasis.
sbi
1
@sbi: Tengo que estar de acuerdo con usted allí, la mayoría de estos ejemplos parecen Modern C ++ 101 de 2006, no hay nada nuevo sobre C ++ 11.
DeadMG
2
@Jetti: el paso más importante para dominar C ++ es aprender todas las formas en que puede evitar la administración manual de la memoria. Es absolutamente algo que debería enseñarse "más tarde", una vez que haya aprendido hasta dónde puede llegar a través de la administración de memoria "automática".
jalf
9

Bastante sí. El hecho simple es que en C ++ 98 y 03, muchas buenas prácticas eran fundamentalmente inutilizables debido a la mala calidad del soporte del lenguaje, por ejemplo, para la programación funcional. Ahora que las lambdas existen y funcionan, las personas tienden a aceptar las interfaces funcionales mucho mejor de lo que solían hacerlo, y la programación genérica es aún más fuerte que antes.

En 1998, la gente recién comenzaba a descubrir cómo escribir código rápido, seguro y de alta calidad usando C ++, y gran parte del código era "C era Clases". En C ++ 11, es muy diferente: modismos como copiar e intercambiar y la Regla de tres (ahora Cinco) son bien conocidos y definidos, y muchos más tipos de gestión de recursos se han convertido en Estándar, como shared_ptry unique_ptrdonde los Estándares anteriores simplemente los dejaron como agujeros enormes.

Puede ver esta pregunta para obtener una excelente lista de material de referencia en C ++.

DeadMG
fuente
1
En realidad, pondría el comienzo del final de "C con clases" unos años antes de 1998, pero en general tienes razón y no regatearía más de media década. +1de mi parte.
sbi
4

No sé el libro específico que mencionas. Pero, en general, puede decir que todos los conceptos básicos sobre la sintaxis, los tipos de datos y la POO de C ++ siguen siendo ciertos. Lo mismo debería ocurrir con las bibliotecas STL que se mencionan en la mayoría de los libros para principiantes.

Aunque un libro tan antiguo como de 1998 puede haber perdido algunas actualizaciones y desarrollos en el estilo de programación C ++, que se acumuló en la comunidad a lo largo de los años. Buscaría recursos un poco más actualizados. Hay más que suficientes tutoriales y documentos en línea gratuitos que deberían proporcionarle un buen comienzo. Algunos de ellos incluso pueden mencionar C ++ 0x.

C ++ 0x seguramente cambiará mucho sobre cómo los programadores ven y usan el lenguaje en el futuro. Pero esto influiría en proyectos más complejos donde las nuevas características comienzan a tener sentido. Para un principiante, esto no debería importar y puede concentrarse en sentirse cómodo con los conceptos existentes, eso ya es suficiente para aprender. La mayoría de los libros para principiantes no profundizan en las plantillas, por ejemplo, por lo que las nuevas plantillas variadas no son lo que necesita saber ahora.

Quizás eche un vistazo a una lista de cambios . Al menos algunos conceptos como rango basado en bucles probablemente aparecerán en nuevos tutoriales incluso para principiantes. Entonces vale la pena echarle un vistazo.

Thorsten Müller
fuente
¡Gracias! ¿Conoces algún recurso decente en línea o libros?
Jetti
2
No, el sitio cplusplus a menudo se menciona como un recurso que nunca, nunca se debe referir a alguien que desee escribir un buen código.
DeadMG
@DeadMG ¿Tiene un sitio web alternativo?
TheLQ
@TheLQ: llegaría más lejos con la referencia de MSDN, o cprogramming.com.
DeadMG
@Jetti: No conozco ningún material para usar C ++ 11 para enseñar C ++. Todo lo que he visto enseña C ++ 11 sobre C ++ 03. Para aprender lo último, consulte stackoverflow.com/questions/388242/… .
sbi
3

Por supuesto, con respecto a cualquier cosa relacionada con la tecnología, estar al día con el material más reciente siempre es un movimiento inteligente, sin embargo, los cambios introducidos en C ++ 11 están diseñados para no sacudir el barco. Si eres nuevo en C ++ (o programación en general), esto no es algo de lo que me preocupe.

Además, si eres un programador profesional, puedes apostar que estarás trabajando en el código de otra persona en el futuro, por lo que siempre es valioso entender cómo funcionan las cosas, incluso si es una técnica depreciada en la práctica.

León
fuente
Gracias por su respuesta, pensé que al menos me ayudaría a mirar el código antiguo cuando uso un recurso antiguo.
Jetti
¿Cómo podrían lambda, autoy la ejecución de funciones asíncronas hacer otra cosa que "sacudir el barco"?
sbi
1
Yo diría que hay una distinción entre la introducción de nuevas herramientas y un amplio cambio en la filosofía de diseño (como estamos viendo con PHP, por ejemplo)
leo
1
@leo: No estoy de acuerdo. La introducción del STL, los punteros inteligentes y las completas instalaciones de plantillas han cambiado por completo la filosofía de diseño convencional de C ++. Casi todas las bibliotecas de impulso son totalmente diferentes de la biblioteca promedio de C ++ de los años 90.
sbi