158 votos

¿Por qué es C++ relativamente "más difícil" a la opción de uso/mal para un principiante?

La mayoría de las opiniones en Stack Overflow parecen expresar una opinión similar: C++ es "más difícil" de usar y es una "mala" elección para un principiante. Hablando como alguien que ha estado aprendiendo C++ como primera lengua, en mi propio tiempo como un hobby, para un par de meses, no parece tan difícil. Es cierto que la primera vez que eché un vistazo a los punteros y su relación con la cruda matrices, el razonamiento detrás de ellos parecía débil. Eso fue antes de que yo creé mi primera pila.

De hecho, cuando me miro en el código C# o Java, parece restrictivo - ¿por qué tengo que escribir una clase para imprimir "hola mundo"?

Supongo que mi pregunta es: ¿qué es exactamente (características reales; no me dan amplias generalizaciones, por favor) hace C++ más duro y está mal para un principiante como yo? Como alternativa, lo que hace que Java/C#/Python etc. más fácil?

(Esta pregunta puede parecer ingenuo, porque yo podría no estar familiarizado con el menor nivel de las instalaciones. No me he metido con bits/bit de desplazamiento ni nada de eso. Yo también no he hecho ninguna GUI/de la programación del juego.)


Estas son algunas de las razones acumuladas por los siguientes cargos:

  • Relación entre matrices y punteros
    • Aritmética de punteros
    • por un error (no C++ exclusivo), y no la comprobación de los límites
  • Plantillas
  • Manual de gestión de la memoria
  • módulos de código (no C++ exclusivo)
  • Preprocesador
  • cadena de apoyo no se construyó en

Algunas soluciones a estos problemas incluyen:

  • Punteros inteligentes para la gestión de la memoria
  • RAII para la gestión de la memoria
  • los iteradores para que fuera una de los errores
  • std::string && std::vector para mitigar el dmg que char* y arr[] causa


Otra queja común parece ser que la gente insiste en C++ "C con Clases". Creo que una buena programación que hace de este un punto discutible, ya que un buen programa de C++ se evite la programación del procedimiento siempre que sea posible. Un buen programador puede también evitar el uso del preprocesador donde sea posible (con la excepción del módulo de soporte, donde es una de las mejores prácticas).

Varias de las respuestas de decir que C++ es "demasiado grande", refiriéndose a los incorporados en las instalaciones o de la STL. Yo creo que esto tiene menos mérito porque los principiantes pueden centrarse en una pequeña porción de la lengua, para empezar.

Jalf plantea un punto interesante que C++ no es necesariamente difícil, debido a su amplia gama de funciones, pero debido a que se requiere de usted (no hay ninguna opción para ignorar) malabares que al aprender a programar. Esa interpretación es uno de los más plausible he visto todavía.

Los demás hasta el momento, la cuestión que se planteó con la suposición tácita: C++ es más difícil de aprender para los principiantes. Creo que ha sido bastante difícil de aprender, pero, obviamente, no tiene nada con qué comparar. No se sabe si el primer coche que se maneja muy bien hasta que has estado en otro. Creo que es un entendido la verdad de que el aprendizaje de C++ es como el aprendizaje de una transmisión manual de como su primer coche. Usted entiende mejor más adelante, pero todavía puede terminar de montar que el embrague demasiado. (Se necesita coraje para montar una metáfora de ese tiempo, pero lo hice.)

Común consenso parece ser que una vez que el maestro de C++, el dominio de algún otro idioma es muy fácil (con la excepción, quizás, de un lenguaje funcional, como F# o Haskell). Este parece ser uno de los más útiles razones para aprender C++ el primer tiempo.


Jalf plantea algunas preguntas interesantes acerca de mi propio conocimiento de la lengua, con esta pregunta:

Sólo por curiosidad, vamos a tener un par de ejemplos de código:

int arr[10] = {};
int* p0 = arr + 1; // 1
int* p1 = arr + 10; // 2
int* p2 = arr + 11; // 3
int v0 = arr[11]; // 4

int arr2[5];
int* p3 = arr2 + 2;
int diff = p0 - p3; // 5
float* fp = reinterpret_cast<float*>(p0); // 6

int i = 42;
int j = i++ + ++i; // 7

Cual de estas líneas son legales, y cuál es el resultado? (Sugerencia: Sólo tres son válidas en C++, y de estos, uno de ellos devuelve un sin especificar valor)

Mis conjeturas eran de 1, 5, y 7 fueron legales. Resulta que 1 y 2 son morales y 6 es legal. Eso fue un poco de una llamada de atención en cuanto a cómo intrincado mi conocimiento de los punteros en C++.

Actualización:

Esta cuestión ya que comenzó como la defensa de mi elección de C++ como primera lengua (y, a partir de ahora, mi único idioma), pensé que debería de actualización de las personas que respondieron en mi progreso.

Mi mayor problema con la programación, a partir de ahora, es simple: no sé cómo hacer nada. Claro, me puede escribir una clase que es útil para alguien más, pero no puedo escribir nada que pudiera ser útil para mí de alguna manera. No estoy seguro, sin embargo, si que tiene algo que ver con C++ como el primer lengua - me pregunto si yo no estoy hecho para ser un programador. Es agradable (y muy frustrante a veces), pero no estoy seguro de si me podía ver a mí mismo haciendo esto a tiempo completo en el futuro.

Una cosa que no me gusta es que hay muchas soluciones para el mismo problema. Esto conduce a varios tipos diferentes de los programadores, pero yo no siento que encajar en el molde de cualquiera de ellos. Creo que esto ES parte de C++'s la culpa, pero yo no podría decir cómo me sentiría acerca de otro lenguaje como Python hasta que lo he intentado.

Yo juego al tenis en mi tiempo libre, y luego resolver el sudoku si que o socialización no son opciones. Dos de ellos tienen varias formas de solucionar los problemas - si mi oponente se apresura a la red, debo lob o intentar golpear a un cruz-corte de inyección que él no puede volea? Ambos métodos tienen fácilmente visible ventajas y desventajas (siendo el primero, lo que si no es lo suficientemente alto o se va? El último, ¿y si él la etiqueta de un ganador en la cruz-la corte?)

El mismo no es cierto en la programación. Un método que parece absolutamente bien para mí podría ser hackish, lento, demasiado complejo o demasiado simplista a otro programador. Esto, junto con mi falta de tiempo y motivación para continuar con la programación, me ha impedido hacer más que escribir una pequeña cantidad de código de cada semana.

Puede alguien pensar de una manera que me motivan pasado esta etapa, ¿piensan que yo debería dar a esta afición?

110voto

jalf Puntos 142628

Hablando como alguien que ha sido el aprendizaje de C++ como primera lengua, en mi propio tiempo como un hobby, para un par de meses, no parece que el esfuerzo

Bien, usted podría haber aprendido otro idioma en una semana. ;)

Pero lo que es más importante, cómo muchos pequeños errores en el do que usted piensa que su pila contiene? No es difícil escribir algo que un compilador de C++ aceptará. Con un poco de esfuerzo, usted puede incluso hacer que el programa resultante aparentemente se comportan como usted desea. Pero es casi seguro que todavía innumerables sutil pero de errores críticos. Por supuesto, no puedo precisar de ellos sin ver a algunos de su código, pero estoy dispuesto a apostar que están ahí.

Tienes razón, C# y Java son restrictivas. Que es una bendición y una maldición. En algunos aspectos es un dolor (como usted dice, de que la creación de una clase para un simple "hola mundo" es una tontería, a pesar de que hace menos de diferencia para programas grandes - otros idiomas no requieren de la clase), pero la ventaja es que al ser más restrictivo, el compilador es capaz de detectar un gran número de errores que en C++ habría pasado desapercibido hasta que se ejecutó el programa. O tal vez hasta que alguien más se ejecutó el programa en un equipo diferente, el primer lunes de Mayo. El problema con C++ es que los errores se convierten en sumamente impredecible.

C++ es un gran lenguaje, de aprendizaje y todas las sutilezas de la toma para siempre, pero esa no es la razón de que sea una mala principiantes del idioma (si es que eso era todo, principiantes puede enfocarse sólo en un pequeño subconjunto del lenguaje inicialmente). El verdadero problema es que es muy difícil acertar.

Y simplemente que cuando estás aprendiendo programación, la parte importante es realmente independientes del lenguaje. Aprender a expresarse en el código, rompiendo cualquier problema en algo que puede ser expresado en términos de un lenguaje de programación, que es la habilidad importante. Pero C++ obliga a aprender que mientras también hacer malabarismos con una lengua muy compleja, donde también tienen a la figura de los punteros, manual de gestión de la memoria, tratar de salir de los límites de la matriz de accesos, críptico plantilla de errores de compilación, pérdidas de memoria, más las pérdidas de memoria y los innumerables casos de un comportamiento indefinido. (casos en que el compilador acepta el código, pero el lenguaje estándar no especifica ningún comportamiento, lo que significa que cualquier cosa puede suceder, incluso si el código parece funcionar. C++ dispone de un gran número de estos casos, mientras que la mayoría de los idiomas intentar agarrar o evitar todos los errores en tiempo de compilación)

Normalmente debería ser mucho más eficaz centrarse en uno a la vez. Iniciar el aprendizaje de la programación en un lenguaje que no pone demasiados obstáculos en frente de usted. Y entonces, cuando usted tiene un control sobre la programación en general, usted puede concentrarse en la complejidad de C++.

(Yo sé que no he mencionado muchas características específicas como usted lo solicitó. El problema es que la mayoría de las características individuales de C++ son relativamente simples (especializaciones de plantilla y punteros tienden a viaje a las personas, pero son manejables, por lo menos. Plantilla de metaprogramación probablemente volverte loco, pero eso es normal ;)). El problema es que todo el sistema de cañerías en el resto de la lengua. Los muchos errores impredecibles que sólo a veces de la superficie, y sólo cuando se ejecuta el programa en algunos equipos, en un mal día, o los problemas que se podrían ejecutar en el intento de conseguir el constructor, el constructor de copia, el operador de asignación y destructor de su clase para trabajar todos juntos para asegurar que los recursos que se filtró y que la clase está siempre en un estado válido.

El problema con C++ es todas las cosas que se parecen a trabajar.

Editar

Sólo por curiosidad, vamos a tener un par de ejemplos de código:

int arr[10] = {};
int* p0 = arr + 1; // 1
int* p1 = arr + 10; // 2
int* p2 = arr + 11; // 3
int v0 = arr[11]; // 4

int arr2[5];
int* p3 = arr2 + 2;
int diff = p0 - p3; // 5
float* fp = reinterpret_cast<float*>(p0); // 6

int i = 42;
int j = i++ + ++i; // 7

Cual de estas líneas son legales, y cuál es el resultado? (Sugerencia: Sólo tres son válidas en C++, y de estos, uno de ellos devuelve un sin especificar valor)

46voto

Comptrol Puntos 4415

No es que duro, usted puede aprender en 21 días!:

alt text

35voto

jeffamaphone Puntos 31732

Restrictiva es más fácil. C y C++ permite pegarse en la cabeza (y quienes lo rodean) en cada vuelta.

Dicho esto, creo que C y C++ son lenguajes bien para un principiante, pero realmente deberías tener a alguien cerca para guiarte y revisar su trabajo si es fundamental en todo. Un mentor, si lo harás.

27voto

Konrad Rudolph Puntos 231505

Yo odio a contribuir a esta pregunta tan tarde, pero creo que sigue siendo una cosa importante que decir.

Lenguajes como C++ son difíciles de aprender "correctamente" (lo que significa) y muy fácil de aprender erróneamente: como un principiante sin experiencia, te va a cortar las esquinas siempre que sea posible y que va a hacer cosas contrarias a diseño, porque no entiende las razones detrás de un (aparentemente complejo) de diseño.

Hay ciertamente no es una manera correcta de programa de C++, pero hay sin duda un tropecientos caminos equivocados. Peor aún, la mayoría de los recursos de aprendizaje fuera de allí son increíblemente. mal. Ellos están realmente que mal. Ellos no sólo fomentar la mala, errónea estilo, les enseñan como canon. Declarar main con tipo de retorno void puede ser una cosa pero no la liberación de los recursos (correctamente), no dando clases de base de los destructores virtuales, utilizando polimórficos matrices, favoreciendo void* a las plantillas son sólo algunas de las cosas fuera de la parte superior de mi cabeza que la mayoría de la enseñanza de los libros de C++ obtener, continuamente, mal.

Si estás aprendiendo C++ sin una orientación adecuada, que es fácil presa de tales prácticas peligrosas y lleva año a desaprender estos mecanismos. Después de empezar con BÁSICOS a mí mismo, puedo dar testimonio de la fuerza destructora del mal material de enseñanza. Básicamente, los tres primeros años de mi aprendizaje del programa se completa pérdida de tiempo. Tres años perdidos. Quien me da un reembolso?

18voto

SeanX Puntos 1475

C++ es mucho más difícil de aprender que python. También es mucho más educativo.

Si usted tiene un dispuesta, maestro competente, quisiera aprovechar la oportunidad para aprender c++. Una vez que usted entienda la administración de memoria, punteros, inflexible y similares, será mucho mejor equipado para una amplia gama de programación.

Es como aprender a conducir, si se aprende el uso de una palanca de cambios, a continuación, un automático es fácil. Si aprender a conducir en un automático, la conducción de una palanca de cambios es una pesadilla.

Ver Joel del artículo para su punto de vista sobre Java escuelas. Muchas de las mismas cosas se aplican.

La otra cara de la moneda es, para la mayoría de las cosas que usted desea programar, c++ no es la mejor opción. Para aplicaciones web, el uso .net, python, ruby, etc. Para windows las aplicaciones de escritorio, utilizar delphi o .net etc. Pero si sabes c++, entonces los otros son fáciles de recoger.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X