tipos resueltos programas programa principiantes para lenguaje ejercicios ejemplos datos comandos caracteristicas avanzados c++

resueltos - ¿El C++ moderno se está volviendo más frecuente?



programas en c++ ejemplos avanzados (18)

Cuando aprendí C ++ hace 6-7 años, lo que aprendí fue básicamente "C con clases". std::vector fue definitivamente un tema avanzado, algo sobre lo que podrías aprender si realmente quisieras. Y ciertamente no había nadie que me dijera que los destructores podrían aprovecharse para ayudar a administrar la memoria. Hoy, donde quiera que miro veo RAII y SFINAE y STL y Boost y, bueno, Modern C ++. Incluso las personas que recién comienzan a usar el lenguaje parecen aprender estos conceptos casi desde el primer día.

Mi pregunta es, ¿es esto simplemente porque solo veo lo "mejor", es decir, las preguntas aquí en SO, y en otros sitios de programación que tienden a atraer principiantes (gamedev.net), o es esto realmente representativo de la C ++ comunidad en su conjunto?

¿El C ++ moderno realmente se está convirtiendo en el predeterminado? En lugar de ser una cosa elegante sobre la que escriben los expertos, ¿se está volviendo "la forma en que C ++ simplemente es"? ¿O simplemente no puedo ver a las miles de personas que todavía aprenden "C con clases" y escriben sus propias matrices dinámicas en lugar de usar std::vector , y hacen la administración de memoria al llamar manualmente a new / delete desde su código de nivel superior?

Por mucho que quiera creerlo, parece increíble si la comunidad C ++ en su conjunto ha evolucionado tanto en unos pocos años. ¿Cuáles son sus experiencias e impresiones?

(Descargo de responsabilidad: Alguien que no esté familiarizado con C ++ podría malinterpretar el título preguntando si C ++ está ganando popularidad frente a otros idiomas. Esa no es mi pregunta. "C ++ moderno" es un nombre común para un dialecto o estilo de programación dentro de C ++, llamado así por el libro " Diseño moderno de C ++: programación genérica y patrones de diseño aplicados ", y estoy interesado únicamente en este frente al" viejo C ++ ". Así que no es necesario decirme que el tiempo de C ++ ha pasado, y todos deberíamos usar Python;))


Absolutamente sí. Para mí, si no estás programando C ++ en este estilo de "C ++ moderno" como dices, ¡entonces no tiene sentido usar C ++! También podría usar C. "Modern C ++" debería ser la única forma en que se programa C ++ en mi opinión, y esperaría que todos los que usan C ++ y que han programado de esta manera "Moderna" estén de acuerdo conmigo. De hecho, siempre estoy completamente conmocionado cuando escucho de un programador de C ++ que no conoce cosas como auto_ptr o ptr_vector. En lo que a mí respecta, esas ideas son básicas y fundamentales para C ++, por lo que no podría imaginarlo de otra manera.


Antes de responder a esa pregunta, debe ponerse de acuerdo sobre qué es "Moderno". Esto no es probable que suceda, ya que "Moderno" es una palabra mal definida, y significa diferentes cosas para diferentes personas. El título del libro de Alexandrescu (Modern C ++ Design) tampoco ayuda mucho, ya que es en gran parte un libro sobre la metaprogramación de plantillas, que es un área específica de C ++ pero de ninguna manera la única.

Para mí, "Modern C ++"! = "Metaprogramación de plantillas". Yo diría que las características de C ++ sobre C entrarían en estas categorías:

  • Clases (Constructores, Destructores, RAII, Dynamic Casting y RTTI)
  • Excepciones
  • Referencias
  • Estructuras de datos y algoritmos en la biblioteca estándar (STL)
  • iostreams
  • Plantillas simples de clase y función
  • Metaprogramación de plantillas

Ninguno de estos son particularmente modernos, ya que han existido alrededor de 10 años o más. La mayoría de estas características son útiles y le permitirán ser más productivo que C directo para muchos casos de uso. Un buen programador debe y usará todos ellos en un proyecto de tamaño decente, pero una de estas cosas no es como la otra:

Metaprogramación de plantillas.

La respuesta corta a la metaprogramación de plantillas es solo decir no. Desafortunadamente para algunas personas, esto también se debe a la "programación C ++ moderna", debido al libro, pero al final crea más problemas de los que resuelve. A menos que C ++ desarrolle mejores mecanismos de programación genéricos como la reflexión, no será adecuado para la programación genérica, y los lenguajes de nivel superior como Python serán más adecuados para esos casos de uso. Por eso y por muchas otras razones, vea el C ++ FQA


Así es como creo que las cosas han evolucionado.

La primera generación de programadores de C ++ eran programadores de C, que de hecho usaban C ++ como C con clases. Además, el STL aún no estaba en su lugar, así que eso es C ++ esencialmente.

Cuando salió el STL, eso fue un avance, pero la mayoría de las personas que escribían libros, preparaban currículos y enseñaban clases habían aprendido C primero, luego ese material extra de C ++, así que la segunda generación aprendió desde esa perspectiva. Como se observó en otra respuesta, si te sientes cómodo escribiendo ciclos regulares, cambiar para usar para cada uno no te cuesta mucho, excepto la cálida sensación de que estás haciendo las cosas de la manera "moderna".

Ahora, tenemos instructores y escritores de libros que han estado usando todo C ++, y obteniendo sus instrucciones desde esa perspectiva, como Accelerated C ++ de Koenig & Moo y el nuevo libro de texto de Stroustrup. Entonces no aprendemos char * y luego std :: strings.

Es una lección interesante sobre cuánto tiempo se necesita para reemplazar los métodos "heredados", especialmente cuando tienen un historial de efectividad.


Creo que acabas de tener una mala experiencia comenzando.

Necesita obtener los libros de Scott Meyers Effective C ++. Comencé con C ++ enfadado en 1999, el líder de mi equipo me hizo sentarme y leer C ++ efectivo y C ++ más efectivo antes de poder verificar CUALQUIER código.

La mayoría de sus consejos son del tipo "No use esta característica , pero si debe, tenga esto en cuenta"

Si sigues su consejo, escribirás un C ++ bueno o "moderno".

Él tiene un libro sobre STL ahora también, pero que no he leído.


Creo que la mayor barrera que he encontrado es el soporte de herramientas, especialmente en proyectos multiplataforma. Hasta hace unos años, era común ver notas de construcción que decían que "la plataforma x necesita que STLport funcione porque su compilador está borked". Incluso ahora, veo problemas con personas que intentan usar múltiples dependencias de terceros vinculadas a diferentes versiones de BOOST. Esto hace que la vinculación sea imposible, lo que significa que tienes que volver y reconstruir tus deps desde cero.

Ahora que casi todos han dejado de usar MSVC ++ 6, el desastre de STLport ha quedado atrás. Pero tan pronto como el TR1 está fuera de la puerta, volvemos a "qué versiones de qué entornos lo admiten y lo hacen bien" y una vez más esto ralentizará la adopción.

Trabajo en un proyecto que comenzó en C (no en C ++) en 1992. Implantar prácticas modernas a través de la base de código heredada sería imposible. Del mismo modo, trabajo en otro proyecto que está mucho más cerca de la vanguardia del lenguaje C ++.


El mejor libro para aprender C ++. "Acelerado C ++" por Koenig & Moo, enseña lo que usted describe como C ++ moderno, así que supongo que la mayoría de la gente en estos días lo está usando. Para aquellos de nosotros que hemos usado C ++ durante bastante tiempo (desde mediados de los 80 en mi caso), C ++ moderno es un gran alivio de las tediosas tareas de escribir nuestras propias matrices, cadenas, tablas hash (repetir hasta la saciedad).


En los días de Windows 3.1, C era el estándar. Cuando C ++ llegó al mercado de desarrolladores y más tarde se convirtió en estándar ANSI, fue el nuevo calor. Popularizó el acrónimo OOP y algunos de los patrones básicos de diseño que usan polimorfismo.

Ahora, con la mayor aceptación de las plataformas administradas de baja barrera para la entrada, como C # /. NET, hay menos razones para usar C ++. Gran parte de la base de desarrolladores tendrá una opción y seamos honestos: C ++ es un oso para aprender para un novato. Con C #, puedes simplemente correr con él.

Eso deja realmente solo las plataformas que NECESITAN C ++ y los difusos evangelistas de C ++ para continuar practicando el arte. Esta es la comunidad que necesita y quiere todas las capas de abstracción que se considera "C ++ moderna".

Así que sí, creo que "C ++ moderno", como tú lo dices, es cada vez más frecuente. Sin embargo, prevalece con un público diferente del que lo ha utilizado en el pasado.


En mi experiencia (Universidad española), desafortunadamente, la norma es no considerar los idiomas en sí misma. Usan los lenguajes más fáciles para enseñar programación (es decir, Java), porque se supone que es fácil para profesores y estudiantes, y luego usan C para las clases de SO y cosas por el estilo.

C ++ se introduce muy levemente (al menos en cualquier curso), solo para proporcionar una C con clases. No entran en boost o incluso STL. Creo que mantenerse al día con todas las características y formas de pensar de C ++ es costoso tanto para profesores como para estudiantes. ¿Cuántos de los programadores de C ++ conocen suficiente de todas las bibliotecas de Boost como para usarlas para ofrecer una mejor solución o para diseñarla? Uno debe tener interés en mantenerse al día con todas las nuevas bibliotecas y modismos.

Sin embargo, como dije, parece que la programación en general (y los lenguajes de programación en particular) no se toman demasiado en serio, ya que parece ser una asignación temporal cuando comienzan un trabajo, y luego olvidan cómo programar a medida que avanzan en el árbol de la empresa. Muchas empresas aquí, y la propia universidad, tienen la sensación de que la programación puede ser realizada por cualquiera.

Si sigues esta filosofía, para la mayoría de las personas que conozco, C ++ siempre será "C con clases".

Saludos,


En mi experiencia, esto depende en gran medida de la edad del producto / proyecto de software. La mayoría de los nuevos proyectos de los que tengo conocimiento usan C ++ moderno (RAII, STL, Boost). Sin embargo, hay muchos proyectos de C ++ que tienen más de 10 años, y no se ve el C ++ moderno allí.

Además, tenga en cuenta que algunas de las implementaciones más populares de STL se rompieron hasta hace unos 5 años (MSVC <7.0 y GNU <3.00)


En mis trabajos en C ++, he descubierto que las funciones modernas se usan cada vez más y más personas me preguntan sobre ellas en las entrevistas y los exámenes de los teléfonos. Por lo que puedo decir, están entendiendo.

Aprendí C ++ originalmente como algo como C con Clases; aunque el lenguaje había avanzado mucho más allá de eso, los libros que leí y las personas con las que trabajé estaban firmemente anclados en "C ++ antiguo". RAII algo en lo que las personas pensarían, en lugar de hacerlo automáticamente, y recuerdo haber leído algunos de los primeros artículos sobre los problemas de la seguridad de las excepciones.

Como se señaló, hay nuevos libros ahora. Muchos de los antiguos siguen siendo relevantes, pero cada vez más parecen estar llenos de explicaciones sobre por qué obviamente las malas ideas son malas. (Del mismo modo, es difícil para los lectores modernos comprender cuán revolucionarias eran las ideas de Freud sobre una mente inconsciente, ya que ahora es la sabiduría convencional).

Stroustrup acaba de publicar un libro de texto, Programming: Principles and Practice Using C ++ . Lo compré porque aún no he logrado aprender cosas buenas de un libro de Stroustrup, pero no he superado los primeros capítulos. Hasta ahora, todo lo que puedo decir es que apruebo la forma en que está comenzando, y al menos es una buena introducción a cómo se debe usar C ++.


Es impresionante lo poco que se necesita para hacer que c ++ sea más estable. El sistema de advertencia está en su lugar, pero no está evolucionando mucho. Es incluso más fácil pegarse un tiro en pie que hace 10 años. No sé por qué, pero c ++ sigue siendo mi idioma favorito. :)


He visto trabajos de C ++ en efecto y las bibliotecas "modernas" se usan cada vez más en descripciones de trabajo, MFC, que es una biblioteca c ++ bastante "antigua", es menos utilizada.


La estandarización del lenguaje a finales de la década de 1990 fue el primer paso, permitió a los fabricantes de compiladores centrarse en el conjunto de características "estándar", y también permitió que el lenguaje solucionara algunos de los aspectos difíciles que aparecieron durante el proceso de estandarización.

Esto, a su vez, permitió el desarrollo de marcos basados ​​en las características estándar del lenguaje, y no en las características proporcionadas por una implementación particular del compilador. La biblioteca de Boost es notablemente en este sentido. También esto permitió que el nuevo desarrollo se basara en trabajos previos, lo que posibilitó la solución de problemas más complejos.

Un cambio notable aquí es cómo los marcos anteriores se basaban en la noción de clases base y clases derivadas (una característica de tiempo de ejecución). Pero ahora las características más avanzadas a menudo se basan en gran medida en plantillas "recursivas" (una característica de tiempo de compilación).

El STL tiene sus pros y sus contras, pero sobrevivió al paso del tiempo, si quieres algo que funcione y sea simple, STL seguramente tiene algo que te ayudará a comenzar. No tiene sentido reinventar la rueda (a menos que sea por razones didácticas).

El hardware de la computadora también ha dado grandes saltos desde la década de 1990, luego la memoria y la CPU ya no son una limitación para el compilador. Entonces la mayoría de las optimizaciones teóricas de los libros ahora son posibles.

Los próximos pasos del lenguaje son el soporte de la programación multi-core, que es parte del esfuerzo estándar 0x.


Mientras trabajo en el proyecto en el que actualmente estoy involucrado, hay una gran cantidad de código C ++ que ha evolucionado durante un período de tiempo significativo (más de 10 años). La evolución de la que hablas es claramente visible allí: el código anterior suele ser "C con clases": punteros sin formato, cadenas de caracteres char* y uso de funciones C asociadas, matrices, etc. el código más nuevo utiliza punteros inteligentes ATL y otros para administrar recursos, pero aún se adhiere a los lazos codificados a mano la mayor parte del tiempo, y el iterador es raro de ver; y el más nuevo está repleto de contenedores STL, algoritmos, shared_ptr (incluyendo supresores personalizados para gestionar identificadores, etc.), plantillas de clases y funciones muy genéricas, y así sucesivamente. La mayoría de las técnicas tradicionales de codificación "C con clases", como punteros sin encapsular en bruto con administración manual de por vida, son muy mal vistas en las revisiones de códigos en estos días. A juzgar por esto, parece que su observación es precisa.

El desarrollo más reciente parece ser una moda para C ++ 0x lambdas, que tiene un lado positivo porque también inclina la balanza a favor del uso de algoritmos estándar sobre bucles codificados a mano, ya que ahora puedes tener todo tu código en línea con algoritmos también.


Muchos equipos en los que he estado y escuchado consideran el gran "¿estamos usando excepciones?" pregunta. Este es el código para "¿estamos usando C ++ moderno?"

Una vez que no esté utilizando excepciones, no podrá utilizar todo el poder del idioma y sus bibliotecas.

Pero muchas bases de código anteriores no tienen excepciones, y se percibe que es difícil calzar las excepciones en una base de código que no las espera, o en un equipo que no sabe cómo usarlas, por lo que la respuesta en tales casos es a menudo ''no''.

En mi experiencia, el C ++ moderno necesita a alguien apasionado en el equipo, que no pueda soportar menos, para impulsarlo. También necesita superar las objeciones de aquellos que quieren que se parezca más al código heredado.

Aunque no creo que las viejas bases de código C ++ se vayan muy rápido, creo que hay más personas apasionadas en el mundo que hace cinco años. Se enfrentan a la misma batalla cuesta arriba que enfrentaron hace cinco años, pero es más probable que encuentren almas gemelas.


No diría que std :: vector califica como "moderno" en estos días. Es realmente básico.

En general, mi impresión es que las personas han adquirido cierta experiencia con el estilo moderno de C ++ y se han vuelto un poco sobrias. Solo para tomar un ejemplo simple, STL for_each fue interesante, pero en la práctica no agrega una gran cantidad de valor sobre un simple bucle C. Es más difícil de depurar y, a veces no proporciona el mejor rendimiento. Además, los constructos para la programación funcional en STL actual son generalmente muy engorrosos, especialmente si tiene experiencia de un lenguaje funcional real como ML.


Si y no. Ciertamente, para nuevos proyectos es cada vez más popular. Sin embargo, todavía existen barreras a la adopción que son prácticas, no políticas, que otros no han mencionado. Hay muchas bibliotecas comerciales de C ++ que utilizan ABI de compiladores antiguos que no admiten las funciones que se ven en Modern C ++, y muchas empresas confían en estas bibliotecas. Sun Studio en Solaris, por ejemplo, no puede funcionar con Boost sin el uso de STLport, pero cualquier biblioteca comercial de terceros que desee utilizar requerirá la versión Sun de STL. La misma historia con GCC 2.95 y Redhat Enterprise Linux.


Soy uno de estos tipos que aprendió a trabajar con STL y escuché mucho sobre RAII y buenas prácticas de programación C ++ desde el día 1. Parece uno de los libros más recomendados para aprender C ++ hoy en día (como Accelerated C ++ y la serie Effective C ++ ) enfóquese en usar herramientas STL en lugar de desplegar sus propias cosas, y también otorgue muchas "reglas" para una programación efectiva (o "moderna").

Pero hablando con amigos, también noté que algunas empresas todavía trabajan con "C con clases", no "C ++ moderno". Quizás la cultura propuesta por los autores y usuarios del "C ++ moderno" prevalecerá algún día :)