¿Qué debo saber sobre C ++? [cerrado]

8

Recientemente comencé a aprender C ++, y lo disfruto mucho.

A menudo he leído que es más fácil escribir código incorrecto en C ++ que en la mayoría de los lenguajes, y que es mucho más profundo de lo que parece.

Como me gustaría evitar escribir código incorrecto, me preguntaba qué es exactamente lo que no debería hacer y qué debo hacer para escribir un buen código en C ++.

Eco distante
fuente
1
¿Qué libros de C ++ has leído o estás leyendo?
Fred Nurk
Ninguna todavia. Estaba buscando buenos libros también, pero encontré muchos de ellos y ahora no sé por dónde empezar ( stackoverflow.com/questions/388242/… )
DistantEcho
No se confunda con los libros, recomendaré Robert Lafore's ( amazon.com/Object-Oriented-Programming-4th-Robert-Lafore/dp/… ) o C ++ Premier ( amazon.com/dp/0201721481/?tag= stackoverfl08-20 ), a medida que avance escribiendo más código, usted mismo sabrá lo que debe evitar. Como no sabes mucho sobre C ++, no creo que puedas entender (Prácticamente) lo que se recomienda evitar en las respuestas aquí.
Guardabosques
3
Cuando la única herramienta en su caja de herramientas es C ++, todo parece un pulgar ...
CurtisHx

Respuestas:

21

Las trampas

Hay tantas dificultades en C ++, que si no las conoce, creará un código muy inestable, con toneladas de pérdidas de memoria y desbordamientos de búfer. En comparación con los idiomas más modernos con recolección de basura, debe liberar toda la memoria usted mismo. Además, el código es de muy bajo nivel. No hay nada que le impida sobrescribir su propio código de programa (que ha sido explotado por muchos hacks de IE).

Entonces, lo siguiente que debe aprender son las prácticas de programación que mitigan estos riesgos, por ejemplo, el uso de punteros inteligentes para manejar la liberación de objetos, envolver conjuntos de bytes en clases que manejan los datos, etc.

Puedo recomendar los libros de Scott Meyers "Effective C ++" y "More Effective C ++".

Esos libros esencialmente me enseñaron la belleza de C ++. Tenga en cuenta que estos no son libros para principiantes. Asumen que ya estás familiarizado con el idioma.

Pete
fuente
44
"Accelerated C ++" de Koenig and Moo es un buen libro para los nuevos programadores de C ++, ya que introdujo plantillas y clases mostrando primero ejemplos de uso, luego diseño y creación. Me resultó más fácil entender por qué usarlos con ese enfoque.
Larry Coleman
Empecé a leer Effective C ++, y realmente ayuda mucho. Gracias !
DistantEcho
2
" No hay nada que te impida sobrescribir tu propio código de programa " ¿Eh? ¿Qué? Esto no es culpa del lenguaje; de ​​hecho, en la mayoría de los sistemas operativos esto no es factible a menos que tome medidas para hacerlo posible. Y los programas mal escritos son potencialmente explotables independientemente del lenguaje en el que estén escritos. Sí, C ++ es de bajo nivel y, sí, tiene sus defectos, pero no nos excedamos con tonterías como esa.
Nik Bougalis
@NikBougalis El sistema operativo lo impide, en los casos en que el sistema operativo lo impide, pero C / C ++, por diseño, le ofrece un método para hacerlo, en los casos en que el sistema operativo no lo impide; mientras que muchos otros idiomas no lo hacen. Por lo tanto, no es una tontería caracterizar esto como un problema de idioma, pero estoy de acuerdo en que el punto original es bastante exagerado.
greggo
55
@greggo es una tontería: uno también puede quejarse de que una taza de café no lo protege de verter accidentalmente sal en su café. El hecho es este: C y C ++ no saben nada sobre su programa o el sistema en el que se está ejecutando. El lenguaje no podría abordar la preocupación "¡zomg! Mi programa fue sobrescrito" sin que primero modifiquemos fundamentalmente los supuestos subyacentes sobre los que se basa el lenguaje.
Nik Bougalis
20

Modismos

C ++ admite una gran variedad de características. Del mismo modo, uno puede ser fácilmente tentado a usarlo de muchas maneras o estilos diferentes. Desafortunadamente, no se adapta bien a muchos de ellos, por lo que se vuelve tedioso, propenso a errores o lento si es así.

O redactado de manera diferente, sin saber realmente lo que haces, es increíblemente fácil usar C ++ de una manera incorrecta (que sería mucho mejor admitido en otros idiomas). Por lo tanto, el aprendizaje simple al hacer puede conducir en una dirección equivocada, por lo que leer buenos libros es probablemente más importante que en otros idiomas (vea esta publicación sobre el mismo tema).

Java, por ejemplo, es un lenguaje inherentemente orientado a objetos. No puedes programarlo de manera muy diferente. En C ++, sin embargo, puedes . Puede usarlo como lo haría en C o Java, y de ninguna manera es en lo que C ++ sobresale, por lo que será mejor que se quede con C o Java en estos casos.

Por lo tanto, realmente necesita conocer el estilo y las expresiones idiomáticas adecuadas para obtener C ++ correctamente, desde el principio. Desafortunadamente, pueden ser bastante complejos al principio, pero aquí hay algunos, desde simples hasta avanzados.

  • Utilizar const
  • No se preocupe por micro-optimizaciones (debo inlineuna función, << o *etc?)
  • Abstenerse de utilizar punteros o matrices sin procesar siempre que sea posible (especialmente void*). Use referencias o punteros inteligentes
  • Escribir código genérico = comprender plantillas
  • Comprender encabezados / archivos de código / preprocesador (pero evitar macros)
  • ¡Use el STL (y comprenda los conceptos subyacentes)!
  • Usar impulso
  • Concéntrese en la duración y el alcance de los objetos: administre RAII
  • En primer lugar, no escriba código orientado a objetos (es decir, mucho polimorfismo de tiempo de ejecución, herencia): existen lenguajes de OO mucho mejores.
  • Use objetos en su lugar
  • Prefiere el polimorfismo estático
  • Usar funciones de tiempo de compilación
Darío
fuente
Gracias por los consejos. Sin embargo, realmente no entiendo por qué debería evitar escribir código orientado a objetos; o te refieres a algunas partes de OOP específicamente?
DistantEcho
1
OOP no solo significa programar con objetos, implica ciertos patrones de diseño, polimorfismo de tiempo de ejecución a través de la herencia, jerarquías de clase ... C ++ no es realmente genial para expresar esto: necesita punteros (inteligentes) y, a menudo, gestión explícita de la memoria para el polimorfismo de tiempo de ejecución, Es relativamente lento y está lleno de trampas (¿alguna vez olvidó un destructor virtual?). A menudo tiene formas más limpias de expresar lo mismo con objetos puros y, por ejemplo, programación genérica / polimorfismo estático.
Dario
2
@Niphra: no se trata de no usar OOP, se trata de no restringirse a OOP. C ++ ofrece múltiples paradigmas, y los buenos programas de C ++ usan la mayoría, si no todos, de ellos.
Matthieu M.
3
Ninguno de estos son modismos. El consejo de OOP es cuestionable en el mejor de los casos y parece depender del miedo en lugar de cualquier razón técnica.
Edward Strange
"alguna vez olvidé un destructor virtual". Sí, es importante activar las advertencias del compilador. Otro: 'la función que devuelve un valor puede no devolver un valor', en el caso de que el valor devuelto requiera un constructor. Kaboom. En mi humilde opinión, esa advertencia debería estar activada por defecto.
greggo
13

El poder de C ++ es que es un lenguaje increíble. El inconveniente de C ++ es que es un lenguaje increíble. Puede ser tanto asombroso como horrible al mismo tiempo.

Si desea aprenderlo, y no hay razón para que no lo haga, deberá aprenderlo bien. Necesitarás leer mucho . Hay algunos libros que lo ayudarán en su camino: C ++ acelerado lo ayudará a comenzar, especialmente si hace los ejercicios. Effective C ++, Effective STL, Exceptional C ++ y sus series continuas se encuentran entre las mejores del juego para obtener pequeños consejos sobre cómo mejorar sus formas de trabajo.

Dragón Kaz
fuente
4

Creo que una cosa que ayudará en su camino de buen código es la experiencia . Por ahora, solo quédese atrapado en el idioma y no se preocupe demasiado por las "mejores prácticas de codificación" hasta que se sienta lo suficientemente cómodo como para comenzar a buscar formas de mejorar su uso. Aprenderá a reconocer lo que es bueno y lo que es malo. Una vez que tenga el idioma abajo, puede mirar hacia atrás y pensar "está bien, debería haber implementado esto de manera diferente" o "esto parece desordenado, ¿cómo puedo mejorarlo?"

Lo pienso así : si aprende un nuevo idioma hablado, no se sumerge directamente y aprende cada regla gramatical antes de comenzar a aprender palabras simples o cómo decir "¿dónde está la parada de autobús?". La programación (IMO) es como un segundo idioma (o tercero, cuarto, etc.). Trátelo como lo haría con cualquier otro idioma y aprenda haciendo. El resto vendrá con el tiempo.

tejón
fuente
1

A menudo he leído que es más fácil escribir código incorrecto en C ++ que en la mayoría de los lenguajes, y que es mucho más profundo de lo que parece

Aclaración: en C ++ es más fácil escribir código incorrecto involuntariamente que en otros lenguajes. Puede escribir código incorrecto en cualquier lenguaje, pero en C ++ se establece con las mejores intenciones, pero a menudo termina en un lugar inesperado porque C ++: después de pasar de "novato" a decir "principiante avanzado", tiene la falsa impresión de que C ++ es más fácil de lo que realmente es. Pero C ++ está evolucionando y todas las nuevas bibliotecas de plantillas hacen que su vida sea más fácil (y más segura).

AndersK
fuente
2
Esto también depende de cómo aprendas C ++. Si comienza a aprenderlo como una C mejorada, es más probable que se meta en problemas en esa etapa que si solo lo aprende como C ++.
David Thornley
Es hora de la cita obligatoria de Stroustrup: "C hace que sea fácil dispararse en el pie; C ++ lo hace más difícil, pero cuando lo hace, le
rompe
-1

Dos cosas:

  1. ¿Cómo funciona la gestión de memoria con C ++?
  2. ¿Cómo afectan los punteros a la gestión de memoria en C ++?
Rachel
fuente
1
es mucho más para c ++ que solo memoria ...
Nazgob