stringtranslate.com

C++

C++ ( / ˈ s p l ʌ s p l ʌ s / , pronunciado " C plus plus " y a veces abreviado como CPP ) es un lenguaje de programación de propósito general de alto nivel creado por el informático danés Bjarne Stroustrup . Lanzado por primera vez en 1985 como una extensión del lenguaje de programación C , desde entonces se ha expandido significativamente con el tiempo; A partir de 1997 , C++ tiene características funcionales , genéricas y orientadas a objetos , además de facilidades para la manipulación de memoria de bajo nivel . Casi siempre se implementa como un lenguaje compilado y muchos proveedores proporcionan compiladores de C++ , incluidos Free Software Foundation , LLVM , Microsoft , Intel , Embarcadero , Oracle e IBM . [14]

C++ fue diseñado teniendo en mente la programación de sistemas y el software integrado con recursos limitados y sistemas grandes, con el rendimiento , la eficiencia y la flexibilidad de uso como puntos destacados de su diseño. [15] C++ también ha resultado útil en muchos otros contextos, siendo sus puntos fuertes clave la infraestructura de software y las aplicaciones con recursos limitados, [15] incluidas aplicaciones de escritorio , videojuegos y servidores (por ejemplo, comercio electrónico , búsqueda web o bases de datos ). y aplicaciones críticas para el rendimiento (por ejemplo, conmutadores telefónicos o sondas espaciales ). [dieciséis]

C++ está estandarizado por la Organización Internacional de Normalización (ISO), y la última versión del estándar fue ratificada y publicada por ISO en diciembre de 2020 como ISO/IEC 14882:2020 (conocida informalmente como C++20 ). [17] El lenguaje de programación C++ se estandarizó inicialmente en 1998 como ISO/IEC 14882:1998 , que luego fue modificado por los estándares C++03 , C++11 , C++14 y C++17 . El estándar actual C++20 los reemplaza con nuevas características y una biblioteca estándar ampliada . Antes de la estandarización inicial en 1998, Stroustrup desarrolló C++ en Bell Labs desde 1979 como una extensión del lenguaje C; quería un lenguaje eficiente y flexible similar a C que también proporcionara características de alto nivel para la organización de programas. [18] Desde 2012, C++ ha tenido un calendario de lanzamiento de tres años [19] con C++23 como el próximo estándar planificado. [20]

Historia

Bjarne Stroustrup, el creador de C++, en su oficina de AT&T en Nueva Jersey, c. 2000

En 1979, Bjarne Stroustrup , un informático danés , comenzó a trabajar en "C with Classes ", el predecesor de C++. [21] La motivación para crear un nuevo lenguaje se originó a partir de la experiencia de Stroustrup en programación para su tesis doctoral. Stroustrup descubrió que Simula tenía características que eran muy útiles para el desarrollo de software a gran escala, pero el lenguaje era demasiado lento para uso práctico, mientras que BCPL era rápido pero de nivel demasiado bajo para ser adecuado para el desarrollo de software a gran escala. Cuando Stroustrup comenzó a trabajar en AT&T Bell Labs , tenía el problema de analizar el kernel de UNIX con respecto a la computación distribuida . experiencia, Stroustrup se propuso mejorar el lenguaje C concaracterísticas similares a Simula . [22] Se eligió C porque era de propósito general, rápido, portátil y ampliamente utilizado. Además de las influencias de C y Simula, otros lenguajes influyeron en este nuevo lenguaje. lenguaje , incluidos ALGOL 68 , Ada , CLU y ML [ cita necesaria ]

Inicialmente, "C con clases" de Stroustrup agregó características al compilador de C, Cpre, incluidas clases , clases derivadas , tipificación segura , inserción en línea y argumentos predeterminados . [23]

Un cuestionario sobre las características de C++11 se realizará en París en 2015

En 1982, Stroustrup comenzó a desarrollar un sucesor de C con clases, al que llamó "C++" ( ++siendo el operador de incremento en C) después de pasar por varios otros nombres. Se agregaron nuevas características, incluidas funciones virtuales , nombre de función y sobrecarga de operadores , referencias , constantes, asignación de memoria de almacenamiento libre con seguridad de tipos (nueva/eliminar), verificación de tipos mejorada y comentarios de una sola línea estilo BCPL con dos barras diagonales ( //). Además, Stroustrup desarrolló un nuevo compilador independiente para C++, Cfront .

En 1984, Stroustrup implementó la primera biblioteca de entrada/salida de flujo. La idea de proporcionar un operador de salida en lugar de una función de salida con nombre fue sugerida por Doug McIlroy [2] (quien previamente había sugerido tuberías Unix ).

En 1985 se lanzó la primera edición del lenguaje de programación C++ , que se convirtió en la referencia definitiva del lenguaje, ya que aún no existía un estándar oficial. [24] La primera implementación comercial de C++ se lanzó en octubre del mismo año. [21]

En 1989, se lanzó C++ 2.0, seguido de la segunda edición actualizada del lenguaje de programación C++ en 1991. [25] Las nuevas características de 2.0 incluían herencia múltiple, clases abstractas, funciones miembro estáticas, funciones miembro constantes y miembros protegidos. En 1990, se publicó el Manual de referencia anotado de C++ . Este trabajo se convirtió en la base del futuro estándar. Las adiciones de funciones posteriores incluyeron plantillas , excepciones , espacios de nombres , nuevas conversiones y un tipo booleano .

En 1998, se lanzó C++98, estandarizando el lenguaje, y en 2003 se lanzó una actualización menor ( C++03 ).

Después de C++ 98, C++ evolucionó relativamente lentamente hasta que, en 2011, se lanzó el estándar C++ 11 , que agregó numerosas características nuevas, amplió aún más la biblioteca estándar y proporcionó más facilidades a los programadores de C++. Después de una actualización menor de C++14 lanzada en diciembre de 2014, se introdujeron varias adiciones nuevas en C++17 . [26] Después de finalizarse en febrero de 2020, [27] un borrador del estándar C++20 se aprobó el 4 de septiembre de 2020 y se publicó oficialmente el 15 de diciembre de 2020. [28] [29]

El 3 de enero de 2018, Stroustrup fue anunciado como el ganador 2018 del Premio Charles Stark Draper de Ingeniería, "por conceptualizar y desarrollar el lenguaje de programación C++". [30]

En diciembre de 2022 , C++ ocupó el tercer lugar en el índice TIOBE , superando a Java por primera vez en la historia del índice. Ocupa el tercer lugar, después de Python y C. [31]

Etimología

Según Stroustrup, "el nombre significa la naturaleza evolutiva de los cambios de C." [32] Este nombre se atribuye a Rick Mascitti (mediados de 1983) [23] y se utilizó por primera vez en diciembre de 1983. Cuando Mascitti fue interrogado informalmente en 1992 sobre el nombre, indicó que se había dado en tono irónico. espíritu. ++ El nombre proviene del operador de C (que incrementa el valor de una variable ) y de una convención de nomenclatura común que consiste en utilizar "+" para indicar un programa informático mejorado.

Durante el período de desarrollo de C++, el lenguaje fue denominado "nuevo C" y "C con clases" [23] [33] antes de adquirir su nombre final.

Filosofía

A lo largo de la vida de C++, su desarrollo y evolución ha estado guiado por un conjunto de principios: [22]

Estandarización

Escena durante la reunión del comité de estándares C++ en Estocolmo en 1996

C++ está estandarizado por un grupo de trabajo ISO conocido como JTC1/SC22/WG21 . Hasta ahora, ha publicado seis revisiones del estándar C++ y actualmente está trabajando en la próxima revisión, C++23 .

En 1998, el grupo de trabajo ISO estandarizó C++ por primera vez como ISO/IEC 14882:1998 , que se conoce informalmente como C++98 . En 2003, publicó una nueva versión del estándar C++ llamada ISO/IEC 14882:2003 , que solucionaba los problemas identificados en C++98.

La siguiente revisión importante del estándar se denominó informalmente "C++0x", pero no se lanzó hasta 2011. [40] C++11 (14882:2011) incluyó muchas adiciones tanto al lenguaje principal como al estándar. biblioteca. [37]

En 2014, C++14 (también conocido como C++1y) se lanzó como una pequeña extensión de C++11, que presenta principalmente correcciones de errores y pequeñas mejoras. [41] Los procedimientos de votación del Proyecto de Norma Internacional finalizaron a mediados de agosto de 2014. [42]

Después de C ++ 14, el comité ISO C ++ completó una revisión importante de C ++ 17 , conocida informalmente como C ++ 1z, a mediados de julio de 2017 y fue aprobada y publicada en diciembre de 2017. [43]

Como parte del proceso de estandarización, ISO también publica informes y especificaciones técnicas :

Se están desarrollando más especificaciones técnicas pendientes de aprobación, incluido un nuevo conjunto de extensiones de simultaneidad. [61]

Idioma

El lenguaje C++ tiene dos componentes principales: un mapeo directo de características de hardware proporcionadas principalmente por el subconjunto C y abstracciones sin sobrecarga basadas en esas asignaciones. Stroustrup describe C++ como "un lenguaje de programación de abstracción liviano [diseñado] para construir y utilizar abstracciones eficientes y elegantes"; [15] y "ofrecer tanto acceso al hardware como abstracción es la base de C++. Hacerlo de manera eficiente es lo que lo distingue de otros lenguajes". [62]

C++ hereda la mayor parte de la sintaxis de C. La siguiente es la versión de Bjarne Stroustrup del programa Hola mundo que utiliza la función de flujo de la biblioteca estándar de C++ para escribir un mensaje en la salida estándar : [63] [64] [nota 2]

#incluir <iostream> int principal () { std :: cout << "¡Hola mundo! \n " ;  }

Almacenamiento de objetos

Al igual que en C, C++ admite cuatro tipos de administración de memoria : objetos de duración de almacenamiento estático, objetos de duración de almacenamiento de subprocesos, objetos de duración de almacenamiento automático y objetos de duración de almacenamiento dinámico. [sesenta y cinco]

Objetos de duración de almacenamiento estático

Los objetos de duración de almacenamiento estático se crean antes main()de ingresar (consulte las excepciones a continuación) y se destruyen en el orden inverso al de creación después de main()las salidas. El orden exacto de creación no está especificado en el estándar (aunque hay algunas reglas definidas a continuación) para permitir a las implementaciones cierta libertad sobre cómo organizar su implementación. Más formalmente, los objetos de este tipo tienen una vida útil que "durará lo que dure el programa". [66]

Los objetos de duración de almacenamiento estático se inicializan en dos fases. Primero, se realiza la "inicialización estática", y solo después de realizar toda la inicialización estática, se realiza la "inicialización dinámica". En la inicialización estática, todos los objetos se inicializan primero con ceros; después de eso, todos los objetos que tienen una fase de inicialización constante se inicializan con la expresión constante (es decir, variables inicializadas con un literal o constexpr). Aunque no está especificado en el estándar, la fase de inicialización estática se puede completar en tiempo de compilación y guardar en la partición de datos del ejecutable. La inicialización dinámica implica toda la inicialización de objetos realizada mediante un constructor o una llamada a función (a menos que la función esté marcada con constexpr, en C++11). El orden de inicialización dinámica se define como el orden de declaración dentro de la unidad de compilación (es decir, el mismo archivo). No se ofrecen garantías sobre el orden de inicialización entre unidades de compilación.

Objetos de duración de almacenamiento de subprocesos

Las variables de este tipo son muy similares a los objetos de duración del almacenamiento estático. La principal diferencia es que el tiempo de creación es justo antes de la creación del hilo y la destrucción se realiza después de que se haya unido el hilo. [67]

Objetos de duración de almacenamiento automático

Los tipos de variables más comunes en C++ son las variables locales dentro de una función o bloque y las variables temporales. [68] La característica común de las variables automáticas es que tienen una vida útil limitada al alcance de la variable. Se crean y potencialmente se inicializan en el momento de la declaración (consulte los detalles a continuación) y se destruyen en el orden inverso a la creación cuando se abandona el alcance. Esto se implementa mediante asignación en la pila .

Las variables locales se crean cuando el punto de ejecución pasa por el punto de declaración. Si la variable tiene un constructor o inicializador, este se utiliza para definir el estado inicial del objeto. Las variables locales se destruyen cuando se cierra el bloque o función local en el que están declaradas. Los destructores de C++ para variables locales se llaman al final de la vida útil del objeto, lo que permite una disciplina para la gestión automática de recursos denominada RAII , que se usa ampliamente en C++.

Las variables miembro se crean cuando se crea el objeto principal. Los miembros de la matriz se inicializan desde 0 hasta el último miembro de la matriz en orden. Las variables miembro se destruyen cuando el objeto principal se destruye en el orden inverso al de creación. es decir, si el padre es un "objeto automático", será destruido cuando salga del alcance, lo que desencadena la destrucción de todos sus miembros.

Las variables temporales se crean como resultado de la evaluación de la expresión y se destruyen cuando la declaración que contiene la expresión se ha evaluado por completo (generalmente al ;final de una declaración).

Objetos de duración de almacenamiento dinámico

Estos objetos tienen una vida útil dinámica y pueden crearse directamente con una llamada a newy destruirse explícitamente con una llamada a delete. [69] C++ también soporta mallocy free, desde C, pero no son compatibles con newy delete. El uso de newdevuelve una dirección a la memoria asignada. Las Directrices principales de C++ desaconsejan el uso newdirecto para la creación de objetos dinámicos en favor de punteros inteligentes mediante propiedad única y propiedad múltiple contada por referencia, [70] que se introdujeron en C++ 11.make_unique<T>make_shared<T>

Plantillas

Las plantillas de C++ permiten la programación genérica . C++ admite plantillas de funciones, clases, alias y variables. Las plantillas pueden parametrizarse por tipos, constantes en tiempo de compilación y otras plantillas. Las plantillas se implementan mediante creación de instancias en tiempo de compilación. Para crear una instancia de una plantilla, los compiladores sustituyen argumentos específicos por los parámetros de una plantilla para generar una función concreta o una instancia de clase. Algunas sustituciones no son posibles; estos se eliminan mediante una política de resolución de sobrecarga descrita por la frase " El fallo de sustitución no es un error " (SFINAE). Las plantillas son una herramienta poderosa que se puede utilizar para programación genérica , metaprogramación de plantillas y optimización de código, pero este poder implica un costo. El uso de plantillas puede aumentar el tamaño del código objeto , porque cada creación de instancias de plantilla produce una copia del código de plantilla: una para cada conjunto de argumentos de plantilla; sin embargo, esta es la misma o menor cantidad de código que se generaría si el código se escribiera a mano. . [71] Esto contrasta con los genéricos en tiempo de ejecución que se ven en otros lenguajes (por ejemplo, Java ), donde en tiempo de compilación el tipo se borra y se conserva un único cuerpo de plantilla.

Las plantillas son diferentes de las macros : si bien ambas características del lenguaje en tiempo de compilación permiten la compilación condicional, las plantillas no se limitan a la sustitución léxica. Las plantillas conocen la semántica y el sistema de tipos de su lenguaje complementario, así como todas las definiciones de tipos en tiempo de compilación, y pueden realizar operaciones de alto nivel, incluido el control de flujo programático basado en la evaluación de parámetros estrictamente verificados. Las macros son capaces de ejercer un control condicional sobre la compilación basándose en criterios predeterminados, pero no pueden crear instancias de nuevos tipos, recurrir ni realizar evaluaciones de tipos y, de hecho, se limitan a la sustitución de texto previa a la compilación y a la inclusión/exclusión de texto. En otras palabras, las macros pueden controlar el flujo de compilación basándose en símbolos predefinidos pero no pueden, a diferencia de las plantillas, crear instancias de nuevos símbolos de forma independiente. Las plantillas son una herramienta para el polimorfismo estático (ver más abajo) y la programación genérica .

Además, las plantillas son un mecanismo en tiempo de compilación en C++ que es Turing-completo , lo que significa que cualquier cálculo expresable por un programa de computadora puede ser calculado, de alguna forma, mediante un metaprograma de plantilla antes del tiempo de ejecución.

En resumen, una plantilla es una función o clase parametrizada en tiempo de compilación escrita sin conocimiento de los argumentos específicos utilizados para crear una instancia. Después de la creación de instancias, el código resultante es equivalente al código escrito específicamente para los argumentos pasados. De esta manera, las plantillas proporcionan una manera de desacoplar aspectos genéricos y ampliamente aplicables de funciones y clases (codificados en plantillas) de aspectos específicos (codificados en parámetros de plantilla) sin sacrificar el rendimiento debido a la abstracción.

Objetos

C++ introduce características de programación orientada a objetos (POO) en C. Ofrece clases , que proporcionan las cuatro características comúnmente presentes en los lenguajes POO (y algunos que no son POO): abstracción , encapsulación , herencia y polimorfismo . Una característica distintiva de las clases de C++ en comparación con las clases de otros lenguajes de programación es la compatibilidad con destructores deterministas , que a su vez brindan soporte para el concepto de adquisición de recursos es inicialización (RAII).

Encapsulación

La encapsulación es ocultar información para garantizar que las estructuras de datos y los operadores se utilicen según lo previsto y para que el modelo de uso sea más obvio para el desarrollador. C++ proporciona la capacidad de definir clases y funciones como sus principales mecanismos de encapsulación. Dentro de una clase, los miembros pueden declararse como públicos, protegidos o privados para aplicar explícitamente la encapsulación. Un miembro público de la clase es accesible a cualquier función. Un miembro privado es accesible sólo para funciones que son miembros de esa clase y para funciones y clases a las que la clase otorga explícitamente permiso de acceso ("amigos"). Un miembro protegido es accesible para los miembros de clases que heredan de la clase además de la clase misma y sus amigos.

El principio orientado a objetos garantiza la encapsulación de todas y sólo las funciones que acceden a la representación interna de un tipo. C++ admite este principio a través de funciones miembro y funciones amigas, pero no lo aplica. Los programadores pueden declarar pública parte o la totalidad de la representación de un tipo, y pueden hacer que entidades públicas no formen parte de la representación de un tipo. Por lo tanto, C++ soporta no sólo la programación orientada a objetos, sino también otros paradigmas de descomposición como la programación modular .

Generalmente se considera una buena práctica hacer que todos los datos sean privados o protegidos y hacer públicas sólo aquellas funciones que forman parte de una interfaz mínima para los usuarios de la clase. Esto puede ocultar los detalles de la implementación de los datos, lo que permite al diseñador cambiar posteriormente fundamentalmente la implementación sin cambiar la interfaz de ninguna manera. [72] [73]

Herencia

La herencia permite que un tipo de datos adquiera propiedades de otros tipos de datos. La herencia de una clase base puede declararse como pública, protegida o privada. Este especificador de acceso determina si las clases derivadas y no relacionadas pueden acceder a los miembros públicos y protegidos heredados de la clase base. Sólo la herencia pública corresponde a lo que habitualmente se entiende por "herencia". Las otras dos formas se utilizan con mucha menos frecuencia. Si se omite el especificador de acceso, una "clase" hereda de forma privada, mientras que una "estructura" hereda públicamente. Las clases base podrán declararse como virtuales; esto se llama herencia virtual . La herencia virtual garantiza que solo exista una instancia de una clase base en el gráfico de herencia, evitando algunos de los problemas de ambigüedad de la herencia múltiple.

La herencia múltiple es una característica de C++ que permite derivar una clase de más de una clase base; esto permite relaciones de herencia más elaboradas. Por ejemplo, una clase "Gato Volador" puede heredar tanto de "Gato" como de "Mamífero Volador". Algunos otros lenguajes, como C# o Java , logran algo similar (aunque más limitado) al permitir la herencia de múltiples interfaces mientras restringen el número de clases base a una (las interfaces, a diferencia de las clases, solo proporcionan declaraciones de funciones miembro, no implementaciones o funciones miembro). datos). Una interfaz como en C# y Java se puede definir en C++ como una clase que contiene sólo funciones virtuales puras, a menudo conocida como clase base abstracta o "ABC". Las funciones miembro de una clase base tan abstracta normalmente se definen explícitamente en la clase derivada, no se heredan implícitamente. La herencia virtual de C++ exhibe una característica de resolución de ambigüedad llamada dominancia .

Operadores y sobrecarga de operadores.

C++ proporciona más de 35 operadores, que cubren aritmética básica, manipulación de bits, direccionamiento indirecto, comparaciones, operaciones lógicas y otros. Casi todos los operadores se pueden sobrecargar para tipos definidos por el usuario, con algunas excepciones notables, como el acceso de miembros ( .y .*), así como el operador condicional. El rico conjunto de operadores sobrecargables es fundamental para hacer que los tipos definidos por el usuario en C++ parezcan tipos integrados.

Los operadores sobrecargables también son una parte esencial de muchas técnicas avanzadas de programación en C++, como los punteros inteligentes . La sobrecarga de un operador no cambia la prioridad de los cálculos que involucran al operador, ni cambia el número de operandos que utiliza el operador (sin embargo, el operador puede ignorar cualquier operando, aunque se evaluará antes de la ejecución). &&Los operadores " " y " " sobrecargados ||pierden su propiedad de evaluación de cortocircuito .

Polimorfismo

El polimorfismo permite una interfaz común para muchas implementaciones y que los objetos actúen de manera diferente en diferentes circunstancias.

C++ admite varios tipos de polimorfismos estáticos (resueltos en tiempo de compilación ) y dinámicos (resueltos en tiempo de ejecución ) , respaldados por las características del lenguaje descritas anteriormente. El polimorfismo en tiempo de compilación no permite ciertas decisiones en tiempo de ejecución, mientras que el polimorfismo en tiempo de ejecución normalmente conlleva una penalización en el rendimiento.

Polimorfismo estático

La sobrecarga de funciones permite a los programas declarar múltiples funciones que tienen el mismo nombre pero con diferentes argumentos (es decir, polimorfismo ad hoc ). Las funciones se distinguen por el número o tipos de sus parámetros formales . Así, el mismo nombre de función puede hacer referencia a diferentes funciones según el contexto en el que se utilice. El tipo devuelto por la función no se utiliza para distinguir funciones sobrecargadas y diferentes tipos de retorno darían como resultado un mensaje de error en tiempo de compilación.

Al declarar una función, un programador puede especificar un valor predeterminado para uno o más parámetros . Hacerlo permite que los parámetros con valores predeterminados se omitan opcionalmente cuando se llama a la función, en cuyo caso se utilizarán los argumentos predeterminados. Cuando se llama a una función con menos argumentos que parámetros declarados, los argumentos explícitos se comparan con los parámetros en orden de izquierda a derecha, y a los parámetros no coincidentes al final de la lista de parámetros se les asignan sus argumentos predeterminados. En muchos casos, es preferible especificar argumentos predeterminados en una única declaración de función que proporcionar definiciones de funciones sobrecargadas con diferentes números de parámetros.

Las plantillas en C++ proporcionan un mecanismo sofisticado para escribir código polimórfico genérico (es decir, polimorfismo paramétrico ). En particular, a través del patrón de plantilla curiosamente recurrente , es posible implementar una forma de polimorfismo estático que imita fielmente la sintaxis para anular funciones virtuales. Debido a que las plantillas de C++ reconocen los tipos y son completas en Turing , también se pueden usar para permitir que el compilador resuelva condicionales recursivos y genere programas sustanciales a través de la metaprogramación de plantillas . Contrariamente a la opinión de algunos, el código de plantilla no generará un código masivo después de la compilación con la configuración adecuada del compilador. [71]

Polimorfismo dinámico

Herencia

Los punteros variables y las referencias a un tipo de clase base en C++ también pueden hacer referencia a objetos de cualquier clase derivada de ese tipo. Esto permite que las matrices y otros tipos de contenedores contengan punteros a objetos de diferentes tipos (las referencias no se pueden guardar directamente en contenedores). Esto permite el polimorfismo dinámico (en tiempo de ejecución), donde los objetos referidos pueden comportarse de manera diferente, dependiendo de sus tipos (reales, derivados).

C++ también proporciona el dynamic_castoperador, que permite que el código intente de forma segura la conversión de un objeto, a través de una referencia/puntero base, a un tipo más derivado: downcasting . El intento es necesario ya que a menudo no se sabe a qué tipo derivado se hace referencia. ( La actualización , conversión a un tipo más general, siempre se puede verificar/realizar en tiempo de compilación a través de static_cast, ya que las clases ancestrales se especifican en la interfaz de la clase derivada, visible para todos los llamantes). dynamic_castse basa en la información de tipo en tiempo de ejecución (RTTI), Metadatos en el programa que permiten diferenciar tipos y sus relaciones. Si dynamic_castfalla un puntero, el resultado es la nullptrconstante, mientras que si el destino es una referencia (que no puede ser nula), la conversión genera una excepción. Los objetos que se sabe que son de un determinado tipo derivado se pueden convertir a ese con static_cast, sin pasar por RTTI y la verificación de tipos en tiempo de ejecución seguro de dynamic_cast, por lo que esto debe usarse solo si el programador está muy seguro de que la conversión es y siempre será válida.

Funciones de miembros virtuales

Normalmente, cuando una función de una clase derivada anula una función de una clase base, la función a llamar está determinada por el tipo de objeto. Una función determinada se anula cuando no existe diferencia en el número o tipo de parámetros entre dos o más definiciones de esa función. Por lo tanto, en tiempo de compilación, puede que no sea posible determinar el tipo de objeto y, por lo tanto, la función correcta a llamar, dado solo un puntero de clase base; por lo tanto, la decisión se pospone hasta el tiempo de ejecución. Esto se llama despacho dinámico . Las funciones o métodos miembro virtuales [74] permiten llamar a la implementación más específica de la función, de acuerdo con el tipo de tiempo de ejecución real del objeto. En las implementaciones de C++, esto se hace comúnmente mediante tablas de funciones virtuales . Si se conoce el tipo de objeto, esto se puede omitir anteponiendo un nombre de clase completo antes de la llamada a la función, pero en general las llamadas a funciones virtuales se resuelven en tiempo de ejecución.

Además de las funciones de miembros estándar, las sobrecargas de operadores y los destructores pueden ser virtuales. Una regla inexacta basada en la experiencia práctica establece que si alguna función de la clase es virtual, el destructor también debería serlo. Como el tipo de un objeto en su creación se conoce en el momento de la compilación, los constructores y, por extensión, los constructores de copia, no pueden ser virtuales. No obstante, puede surgir una situación en la que sea necesario crear una copia de un objeto cuando se pasa un puntero a un objeto derivado como puntero a un objeto base. En tal caso, una solución común es crear una función virtual (o similar) que cree y devuelva una copia de la clase derivada cuando se llama.clone()

Una función miembro también se puede convertir en "virtual pura" agregándola después del paréntesis de cierre y antes del punto y coma. Una clase que contiene una función virtual pura se llama clase abstracta . Los objetos no se pueden crear a partir de una clase abstracta; sólo se pueden derivar de ellos. Cualquier clase derivada hereda la función virtual como pura y debe proporcionar una definición no pura de ella (y de todas las demás funciones virtuales puras) antes de que se puedan crear objetos de la clase derivada. Un programa que intenta crear un objeto de una clase con una función miembro virtual pura o una función miembro virtual pura heredada está mal formado.= 0

expresiones lambda

C++ proporciona soporte para funciones anónimas , también conocidas como expresiones lambda , con la siguiente forma: [75]

[ captura ] ( parámetros ) -> tipo_retorno { cuerpo_función }     

Desde C++ 20, la palabra clave templatees opcional para los parámetros de plantilla de expresiones lambda:

[ captura ] < parámetros_plantilla > ( parámetros ) -> tipo_retorno { cuerpo_función }     

Si lambda no toma parámetros y no se utiliza ningún tipo de retorno u otros especificadores, se puede omitir (); eso es,

[ captura ] { función_cuerpo }   

El tipo de retorno de una expresión lambda se puede inferir automáticamente, si es posible; p.ej:

[]( int x , int y ) { retorno x + y ; } // inferido []( int x , int y ) -> int { return x + y ; } // explícito                      

La lista apoya la definición de cierres . Estas expresiones lambda se definen en el estándar como azúcar sintáctico para un objeto de función sin nombre .[capture]

Manejo de excepciones

El manejo de excepciones se utiliza para comunicar la existencia de un problema o error de tiempo de ejecución desde donde se detectó hasta donde se puede manejar el problema. [76] Permite que esto se haga de manera uniforme y por separado del código principal, al tiempo que detecta todos los errores. [77] Si ocurre un error, se lanza (genera) una excepción, que luego es detectada por el controlador de excepciones adecuado más cercano. La excepción hace que se salga del ámbito actual, y también de cada ámbito externo (propagación) hasta que se encuentre un controlador adecuado, llamando a su vez a los destructores de cualquier objeto en estos ámbitos salidos. [78] Al mismo tiempo, una excepción se presenta como un objeto que contiene los datos sobre el problema detectado. [79]

Algunas guías de estilo de C++, como las de Google, [80] LLVM, [81] y Qt, [82] prohíben el uso de excepciones.

El código que causa la excepción se coloca dentro de un trybloque. Las excepciones se manejan en catchbloques separados (los controladores); cada trybloque puede tener múltiples controladores de excepciones, como se puede ver en el siguiente ejemplo. [83]

#incluir <iostream> #incluir <vector> #incluir <stdexcept> int principal () {   intentar {  estándar :: vector < int > vec { 3 , 4 , 3 , 1 };     int yo { vec . a las 4 )}; // Lanza una excepción, std::out_of_range (la indexación para vec es de 0-3, no de 1-4)   } // Un controlador de excepciones, detecta std::out_of_range, que es lanzado por vec.at(4) captura ( const std :: fuera_de_rango & e ) {     std :: cerr << "Accediendo a un elemento inexistente: " << e . qué () << '\n' ;       } // Para detectar cualquier otra excepción de biblioteca estándar (se derivan de std::exception) captura ( const std :: excepción y e ) {     std :: cerr << "Excepción lanzada: " << e . qué () << '\n' ;       } // Detecta cualquier excepción no reconocida (es decir, aquellas que no se derivan de std::exception) atrapar (...) {   std :: cerr << "Algún error fatal \n " ;   }}

También es posible generar excepciones intencionadamente, utilizando la throwpalabra clave; Estas excepciones se manejan de la forma habitual. En algunos casos, no se pueden utilizar excepciones por motivos técnicos. Un ejemplo de ello es un componente crítico de un sistema integrado, donde se debe garantizar que cada operación se complete dentro de un período de tiempo específico. Esto no se puede determinar con excepciones ya que no existen herramientas para determinar el tiempo máximo requerido para manejar una excepción. [84]

A diferencia del manejo de señales , en el que la función de manejo se llama desde el punto de falla, el manejo de excepciones sale del alcance actual antes de ingresar al bloque catch, que puede estar ubicado en la función actual o en cualquiera de las llamadas a funciones anteriores actualmente en la pila.

Tipos enumerados

C++ tiene tipos de enumeración que se heredan directamente de C y funcionan en su mayoría de la misma manera, excepto que una enumeración es un tipo real en C++, lo que proporciona una verificación adicional en tiempo de compilación. Además (al igual que con las estructuras), la palabra clave C++ enumse combina con typedef , de modo que en lugar de nombrar el tipo enum name, simplemente nómbrelo name. Esto se puede simular en C usando un typedef:typedef enum {Value1, Value2} name;

C++ 11 también proporciona un segundo tipo de enumeración, llamada enumeración de ámbito . Estos son de tipo seguro: los enumeradores no se convierten implícitamente a un tipo entero. Entre otras cosas, esto permite definir la transmisión de E/S para el tipo de enumeración. Otra característica de las enumeraciones con alcance es que los enumeradores no tienen fugas, por lo que su uso requiere anteponer el nombre de la enumeración (por ejemplo, Color::Redpara el primer enumerador en el ejemplo siguiente), a menos que se haya utilizado una using enumdeclaración (introducida en C++20 ). para llevar a los enumeradores al alcance actual. Una enumeración con ámbito se especifica mediante la frase enum class(o enum struct). Por ejemplo:

clase de enumeración Color { Rojo , Verde , Azul };     

El tipo subyacente de una enumeración es un tipo integral definido por la implementación que es lo suficientemente grande como para contener todos los valores enumerados; no tiene que ser el tipo más pequeño posible. El tipo subyacente se puede especificar directamente, lo que permite "declaraciones directas" de enumeraciones:

clase de enumeración Color : largo { rojo , verde , azul }; // debe ajustarse en tamaño y diseño de memoria al tipo de clase de enumeración 'larga' Formas : char ; // declaración directa. Si luego hay valores definidos que no caben en 'char' es un error.             

Biblioteca estándar

El borrador del estándar "Documento de trabajo" que fue aprobado como C++98; la mitad de su tamaño se dedicó a la biblioteca estándar de C++.

El estándar C++ consta de dos partes: el lenguaje central y la biblioteca estándar. Los programadores de C++ esperan esto último en cada implementación importante de C++; incluye tipos agregados ( vectores , listas, mapas, conjuntos, colas, pilas, matrices, tuplas), algoritmos (find, for_each , binario_search , random_shuffle, etc.), funciones de entrada/salida ( iostream , para leer y escribir en el consola y archivos), biblioteca de sistema de archivos, soporte de localización, punteros inteligentes para la administración automática de memoria, soporte de expresiones regulares , biblioteca de subprocesos múltiples , soporte atómico (que permite que una variable sea leída o escrita por como máximo un subproceso a la vez sin ningún tipo externo sincronización), utilidades de tiempo (medición, obtención de la hora actual, etc.), un sistema para convertir informes de errores que no utilizan excepciones de C++ en excepciones de C++, un generador de números aleatorios y una versión ligeramente modificada de la biblioteca estándar de C (para hacer cumple con el sistema de tipo C++).

Una gran parte de la biblioteca C++ se basa en la Biblioteca de plantillas estándar (STL). Las herramientas útiles proporcionadas por STL incluyen contenedores como colecciones de objetos (como vectores y listas ), iteradores que brindan acceso tipo matriz a contenedores y algoritmos que realizan operaciones como búsqueda y clasificación.

Además, se proporcionan (múltiples)mapas ( matrices asociativas ) y (múltiples)conjuntos, todos los cuales exportan interfaces compatibles. Por lo tanto, utilizando plantillas es posible escribir algoritmos genéricos que funcionen con cualquier contenedor o en cualquier secuencia definida por iteradores. Al igual que en C, se accede a las funciones de la biblioteca mediante la #include directiva para incluir un encabezado estándar . La biblioteca estándar de C++ proporciona 105 encabezados estándar, de los cuales 27 están en desuso.

El estándar incorpora el STL que fue diseñado originalmente por Alexander Stepanov , quien experimentó con algoritmos y contenedores genéricos durante muchos años. Cuando comenzó con C++, finalmente encontró un lenguaje en el que era posible crear algoritmos genéricos (por ejemplo, clasificación STL) que funcionan incluso mejor que, por ejemplo, la biblioteca estándar de C qsort, gracias a las características de C++ como el uso de líneas en línea y compilación. enlace de tiempo en lugar de punteros de función. El estándar no se refiere a él como "STL", ya que es simplemente una parte de la biblioteca estándar, pero el término todavía se usa ampliamente para distinguirlo del resto de la biblioteca estándar (flujos de entrada/salida, internacionalización, diagnóstico, el subconjunto de la biblioteca C, etc.). [85]

La mayoría de los compiladores de C++, y todos los principales, proporcionan una implementación conforme a los estándares de la biblioteca estándar de C++.

Directrices básicas de C++

Las directrices básicas de C++ [86] son ​​una iniciativa liderada por Bjarne Stroustrup, el inventor de C++, y Herb Sutter, coordinador y presidente del grupo de trabajo ISO de C++, para ayudar a los programadores a escribir 'C++ moderno' utilizando las mejores prácticas para el lenguaje. estándares C++ 11 y posteriores, y para ayudar a los desarrolladores de compiladores y herramientas de verificación estática a crear reglas para detectar malas prácticas de programación.

El objetivo principal es escribir C++ seguro para tipos y recursos de manera eficiente y consistente.

Las Directrices Básicas se anunciaron [87] en el discurso de apertura de CPPCon 2015.

Las Directrices van acompañadas de la Biblioteca de soporte de directrices (GSL), [88] una biblioteca de tipos y funciones de solo encabezado para implementar las Directrices básicas y herramientas de verificación estática para hacer cumplir las reglas de las Directrices. [89]

Compatibilidad

Para dar mayor libertad a los proveedores de compiladores, el comité de estándares de C++ decidió no dictar la implementación de la manipulación de nombres , el manejo de excepciones y otras características específicas de la implementación. La desventaja de esta decisión es que se espera que el código objeto producido por diferentes compiladores sea incompatible. Sin embargo, existen intentos de estandarizar los compiladores para máquinas o sistemas operativos particulares . Por ejemplo, la ABI de Itanium C++ es independiente del procesador (a pesar de su nombre) y está implementada por GCC y Clang. [90]

Con C

A menudo se considera que C++ es un superconjunto de C , pero esto no es estrictamente cierto. [91] La mayoría del código C se puede compilar fácilmente correctamente en C++, pero existen algunas diferencias que hacen que algunos códigos C válidos no sean válidos o se comporten de manera diferente en C++. Por ejemplo, C permite la conversión implícita a otros tipos de puntero, pero C++ no (por razones de seguridad de tipos). Además, C++ define muchas palabras clave nuevas, como y , que pueden usarse como identificadores (por ejemplo, nombres de variables) en un programa en C.void*newclass

Algunas incompatibilidades se eliminaron con la revisión de 1999 del estándar C ( C99 ), que ahora admite características de C++ como comentarios de línea ( //) y declaraciones mezcladas con código. Por otro lado, C99 introdujo una serie de características nuevas que C++ no admitía y que eran incompatibles o redundantes en C++, como matrices de longitud variable , tipos nativos de números complejos (sin embargo, la clase en la biblioteca estándar de C++ proporciona una funcionalidad similar , aunque no es compatible con el código), inicializadores designados, literales compuestos y la palabra clave. [92] Algunas de las características introducidas por C99 se incluyeron en la versión posterior del estándar C++, C++11 (de aquellas que no eran redundantes). [93] [94] [95] Sin embargo, el estándar C++ 11 introduce nuevas incompatibilidades, como no permitir la asignación de un literal de cadena a un puntero de carácter, que sigue siendo válido en C.std::complexrestrict

Para mezclar código C y C++, cualquier declaración o definición de función que deba llamarse o usarse tanto en C como en C++ debe declararse con enlace C colocándola dentro de un bloque. Es posible que dicha función no dependa de características que dependan de la alteración de nombres (es decir, sobrecarga de funciones).extern "C" {/*...*/}

Crítica

A pesar de su adopción generalizada, algunos programadores notables han criticado el lenguaje C++, incluidos Linus Torvalds , [96] Richard Stallman , [97] Joshua Bloch , Ken Thompson , [98] [99] [100] y Donald Knuth . [101] [102]

Uno de los puntos más criticados de C++ es su complejidad percibida como lenguaje, con la crítica de que una gran cantidad de características no ortogonales en la práctica requieren restringir el código a un subconjunto de C++, evitando así los beneficios de legibilidad del estilo y los modismos comunes. . Como lo expresa Joshua Bloch :

Creo que C++ fue llevado mucho más allá de su umbral de complejidad y, sin embargo, hay mucha gente programándolo. Pero lo que haces es obligar a la gente a subdividirlo. Entonces, casi todas las tiendas que conozco que usan C++ dicen: "Sí, estamos usando C++ pero no estamos haciendo herencia de implementación múltiple y no estamos usando la sobrecarga de operadores". Sólo hay un montón de características que no vas a utilizar porque la complejidad del código resultante es demasiado alta. Y no creo que sea bueno tener que empezar a hacer eso. Se pierde esta portabilidad del programador donde todos pueden leer el código de los demás, lo cual creo que es algo muy bueno.

Donald Knuth (1993, comentando sobre C++ pre-estandarizado), quien dijo de Edsger Dijkstra que "pensar en programar en C++" "lo enfermaría físicamente": [101] [102]

El problema que tengo con ellos hoy es que... C++ es demasiado complicado. Por el momento, me resulta imposible escribir código portátil que creo que funcione en muchos sistemas diferentes, a menos que evite todas las características exóticas. Cada vez que los diseñadores del lenguaje C++ tenían dos ideas en competencia sobre cómo deberían resolver algún problema, decían "Está bien, haremos ambas". Entonces el lenguaje es demasiado barroco para mi gusto.

Ken Thompson , que fue colega de Stroustrup en Bell Labs, da su valoración: [99] [100]

Sin duda tiene sus puntos buenos. Pero en general creo que es un mal lenguaje. Hace muchas cosas medio bien y es sólo un montón de basura de ideas que se excluyen mutuamente. Todas las personas que conozco, ya sean personales o corporativas, seleccionan un subconjunto y estos subconjuntos son diferentes. Así que no es un buen lenguaje para transportar un algoritmo, decir: "Yo lo escribí; toma, tómalo". Es demasiado grande, demasiado complejo. Y obviamente lo construye un comité . Stroustrup hizo campaña durante años y años y años, mucho más allá de cualquier tipo de contribución técnica que hiciera al idioma, para lograr que se adoptara y utilizara. Y dirigió todos los comités de normas con un látigo y una silla. Y no dijo "no" a nadie. Puso en ese idioma todos los rasgos que alguna vez existieron. No fue un diseño limpio: fue simplemente la unión de todo lo que surgió. Y creo que sufrió drásticamente por eso.

Sin embargo, Brian Kernighan , también colega de Bell Labs, cuestiona esta evaluación: [103]

C++ ha sido enormemente influyente. ... Mucha gente dice que C++ es demasiado grande y demasiado complicado, etc., etc., pero en realidad es un lenguaje muy poderoso y casi todo lo que contiene está ahí por una razón muy sólida: no es alguien que hace una invención al azar. , en realidad son personas que intentan resolver problemas del mundo real. Ahora bien, muchos de los programas que hoy damos por sentado, que simplemente usamos, son programas C++.

El propio Stroustrup comenta que la semántica de C++ es mucho más limpia que su sintaxis: "dentro de C++, hay un lenguaje mucho más pequeño y limpio que lucha por salir". [104]

Otras quejas pueden incluir falta de reflexión o recolección de basura , tiempos de compilación prolongados, pérdida de funciones percibida [105] y mensajes de error detallados, particularmente de metaprogramación de plantillas . [106]

Ver también

Notas a pie de página

  1. ^ Para conocer la idea de las rutinas sin pila de C++20.
  2. ^ Este código se copia directamente de la página de erratas de Bjarne Stroustrup (p. 633). Aborda el uso de '\n'en lugar de std::endl. Consulte también ¿Puedo escribir "void main()"? Archivado el 2 de julio de 2020 en Wayback Machine para obtener una explicación de lo implícito return 0;en la mainfunción. Este retorno implícito no está disponible en otras funciones.

Referencias

  1. ^ "Descripción general de módulos en C++". Microsoft. 24 de abril de 2023.
  2. ^ abcdef Stroustrup, Bjarne (1996). "Una historia de C++: 1979-1991". Historia de los lenguajes de programación---II . ACM . págs. 699–769. doi : 10.1145/234286.1057836 .
  3. ^ Stroustrup, Bjarne (16 de diciembre de 2021). "C++20: Alcanzando los objetivos de C++ - Bjarne Stroustrup - CppCon 2021". CppCon. Archivado desde el original el 30 de diciembre de 2021 . Consultado el 30 de diciembre de 2021 .
  4. ^ Stroustrup, Bjarne (12 de junio de 2020). "Prosperar en un mundo abarrotado y cambiante: C++ 2006-2020". Actas de la ACM sobre lenguajes de programación . Asociación de Maquinaria de Computación (ACM). 4 (HOPL): 1–168. doi : 10.1145/3386320 . ISSN  2475-1421. S2CID  219603741.
  5. ^ Naugler, David (mayo de 2007). "Programador de C# 2.0 para C++ y Java: taller de conferencia". Revista de Ciencias de la Computación en las Universidades . 22 (5). Aunque C# ha sido fuertemente influenciado por Java, también lo ha sido por C++ y es mejor verlo como un descendiente tanto de C++ como de Java.
  6. ^ "Especificaciones de la capilla (agradecimientos)" (PDF) . Cray Inc. 1 de octubre de 2015. Archivado (PDF) desde el original el 24 de junio de 2018 . Consultado el 14 de enero de 2016 .
  7. ^ "Preguntas y respuestas sobre Rich Hickey por Michael Fogus". Archivado desde el original el 11 de enero de 2017 . Consultado el 11 de enero de 2017 .
  8. ^ Harry. H. Chaudhary (28 de julio de 2014). "Descifrando la entrevista de programación Java :: Más de 2000 preguntas/respuestas de entrevistas Java". Archivado desde el original el 27 de mayo de 2021 . Consultado el 29 de mayo de 2016 .
  9. ^ Roger Poon (1 de mayo de 2017). "Escalado JS ++: abstracción, rendimiento y legibilidad". Archivado desde el original el 11 de mayo de 2020 . Consultado el 21 de abril de 2020 .
  10. ^ "La evolución de un lenguaje de extensión: una historia de Lua". www.lua.org . Consultado el 4 de enero de 2023 .
  11. ^ "Preguntas frecuentes sobre el lenguaje de programación Nim". Archivado desde el original el 11 de julio de 2017 . Consultado el 21 de abril de 2020 .
  12. ^ "9. Clases: documentación de Python 3.6.4". docs.python.org . Archivado desde el original el 23 de octubre de 2012 . Consultado el 9 de enero de 2018 .
  13. ^ "Influencias: la referencia de Rust". doc.rust-lang.org . Consultado el 4 de enero de 2023 .
  14. ^ Stroustrup, Bjarne (1997). "1". El lenguaje de programación C ++ (Tercera ed.). Addison-Wesley. ISBN 0-201-88954-4. OCLC  59193992.
  15. ^ abc Stroustrup, B. (6 de mayo de 2014). "Conferencia: La esencia de C++. Universidad de Edimburgo". YouTube . Archivado desde el original el 28 de abril de 2015 . Consultado el 12 de junio de 2015 .
  16. ^ Stroustrup, Bjarne (17 de febrero de 2014). "Aplicaciones C++". stroustrup.com . Archivado desde el original el 4 de abril de 2021 . Consultado el 5 de mayo de 2014 .
  17. ^ ab "ISO/IEC 14882:2020". Organización Internacional de Normalización. Archivado desde el original el 16 de diciembre de 2020 . Consultado el 16 de diciembre de 2020 .
  18. ^ "Página de inicio de Bjarne Stroustrup". www.stroustrup.com . Archivado desde el original el 14 de mayo de 2019 . Consultado el 15 de mayo de 2013 .
  19. ^ "Programa IS de C++" (PDF) . Archivado (PDF) desde el original el 10 de agosto de 2020 . Consultado el 9 de agosto de 2020 .
  20. ^ "C++; hacia dónde se dirige". Archivado desde el original el 3 de diciembre de 2018 . Consultado el 3 de diciembre de 2018 .
  21. ^ ab Stroustrup, Bjarne (7 de marzo de 2010). "Preguntas frecuentes de Bjarne Stroustrup: ¿Cuándo se inventó C++?". stroustrup.com . Archivado desde el original el 6 de febrero de 2016 . Consultado el 16 de septiembre de 2010 .
  22. ^ ab Stroustrup, Bjarne. "Evolución de un lenguaje en y para el mundo real: C++ 1991-2006" (PDF) . Archivado (PDF) desde el original el 20 de noviembre de 2007 . Consultado el 14 de agosto de 2013 .
  23. ^ abc Stroustrup, Bjarne. "Una historia de C++: 1979-1991" (PDF) . Archivado (PDF) desde el original el 2 de febrero de 2019 . Consultado el 18 de julio de 2013 .
  24. ^ Stroustrup, Bjarne. "El lenguaje de programación C++" (Primera ed.). Archivado desde el original el 9 de agosto de 2012 . Consultado el 16 de septiembre de 2010 .
  25. ^ Stroustrup, Bjarne. "El lenguaje de programación C++" (Segunda ed.). Archivado desde el original el 9 de agosto de 2012 . Consultado el 16 de septiembre de 2010 .
  26. ^ Sutter, Herb (30 de junio de 2016). "Informe de viaje: reunión de verano sobre estándares ISO C++ (Oulu)". herbsutter.com . Archivado desde el original el 8 de octubre de 2016. el próximo estándar después de C++ 17 será C++ 20
  27. ^ Dusíková, Hana (6 de noviembre de 2019). "N4817: Invitación e información a la reunión de Praga 2020" (PDF) . Archivado (PDF) desde el original el 29 de diciembre de 2019 . Consultado el 13 de febrero de 2020 .
  28. ^ "Estado actual". isocpp.org . Archivado desde el original el 8 de septiembre de 2020 . Consultado el 7 de septiembre de 2020 .
  29. ^ "Aprobado por C ++ 20: Herb Sutter". isocpp.org . Archivado desde el original el 11 de septiembre de 2020 . Consultado el 8 de septiembre de 2020 .
  30. ^ "El pionero de la informática Bjarne Stroustrup recibirá el premio Charles Stark Draper de ingeniería 2018" (Presione soltar). Academia Nacional de Ingeniería. 3 de enero de 2018. Archivado desde el original el 3 de enero de 2018 . Consultado el 14 de diciembre de 2021 .
  31. ^ TIOBE (enero de 2022). "Índice TIOBE de enero de 2021". TIOBE.com . Empresa TIOBE. Archivado desde el original el 25 de febrero de 2018 . Consultado el 2 de febrero de 2022 .
  32. ^ "Preguntas frecuentes de Bjarne Stroustrup: ¿de dónde viene el nombre" C++ "?". Archivado desde el original el 6 de febrero de 2016 . Consultado el 16 de enero de 2008 .
  33. ^ "C para programadores de C++". Universidad del Noroeste . Archivado desde el original el 17 de noviembre de 2010 . Consultado el 7 de septiembre de 2015 .
  34. ^ "Historia de C++". es.cppreference.com . Archivado desde el original el 2 de febrero de 2022 . Consultado el 16 de marzo de 2022 .
  35. ^ "ISO/CEI 14882:1998". Organización Internacional de Normalización. Archivado desde el original el 15 de enero de 2017 . Consultado el 23 de noviembre de 2018 .
  36. ^ "ISO/CEI 14882:2003". Organización Internacional de Normalización. Archivado desde el original el 13 de agosto de 2021 . Consultado el 23 de noviembre de 2018 .
  37. ^ ab "ISO/IEC 14882:2011". Organización Internacional de Normalización. Archivado desde el original el 27 de mayo de 2016 . Consultado el 23 de noviembre de 2018 .
  38. ^ "ISO/IEC 14882:2014". Organización Internacional de Normalización. Archivado desde el original el 29 de abril de 2016 . Consultado el 23 de noviembre de 2018 .
  39. ^ "ISO/IEC 14882:2017". Organización Internacional de Normalización. Archivado desde el original el 29 de enero de 2013 . Consultado el 2 de diciembre de 2017 .
  40. ^ "Tenemos un estándar internacional: C++ 0x está aprobado por unanimidad". Molino de Sutter . 12 de agosto de 2011. Archivado desde el original el 28 de junio de 2018 . Consultado el 23 de noviembre de 2018 .
  41. ^ "El futuro de C++". Archivado desde el original el 23 de octubre de 2018 . Consultado el 23 de noviembre de 2018 , a través de channel9.msdn.com.
  42. ^ "¡Tenemos C++ 14!: C++ estándar". isocpp.org . Archivado desde el original el 19 de agosto de 2014 . Consultado el 19 de agosto de 2014 .
  43. ^ Sutter, Herb (15 de julio de 2017). "Informe de viaje: reunión de verano sobre estándares ISO C++ (Toronto)". Archivado desde el original el 6 de agosto de 2017 . Consultado el 4 de agosto de 2017 .
  44. ^ "ISO/IEC TR 18015:2006". Organización Internacional de Normalización. Archivado desde el original el 15 de enero de 2019 . Consultado el 15 de febrero de 2019 .
  45. ^ "ISO/IEC TR 19768:2007". Organización Internacional de Normalización. Archivado desde el original el 4 de marzo de 2016 . Consultado el 15 de febrero de 2019 .
  46. ^ "ISO/IEC TR 29124:2010". Organización Internacional de Normalización. Archivado desde el original el 12 de enero de 2019 . Consultado el 15 de febrero de 2019 .
  47. ^ "ISO/IEC TR 24733:2011". Organización Internacional de Normalización. Archivado desde el original el 15 de enero de 2019 . Consultado el 15 de febrero de 2019 .
  48. ^ "ISO/IEC TS 18822:2015". Organización Internacional de Normalización. Archivado desde el original el 15 de enero de 2019 . Consultado el 15 de febrero de 2019 .
  49. ^ "ISO/IEC TS 19570:2015". Organización Internacional de Normalización. Archivado desde el original el 15 de enero de 2019 . Consultado el 15 de febrero de 2019 .
  50. ^ "ISO/IEC TS 19841:2015". Organización Internacional de Normalización. Archivado desde el original el 15 de enero de 2019 . Consultado el 15 de febrero de 2019 .
  51. ^ "ISO/IEC TS 19568:2015". Organización Internacional de Normalización. Archivado desde el original el 15 de enero de 2019 . Consultado el 15 de febrero de 2019 .
  52. ^ "ISO/IEC TS 19217:2015". Organización Internacional de Normalización. Archivado desde el original el 15 de enero de 2019 . Consultado el 15 de febrero de 2019 .
  53. ^ "ISO/IEC TS 19571:2016". Organización Internacional de Normalización. Archivado desde el original el 15 de enero de 2019 . Consultado el 15 de febrero de 2019 .
  54. ^ "ISO/IEC TS 19568:2017". Organización Internacional de Normalización. Archivado desde el original el 15 de enero de 2019 . Consultado el 15 de febrero de 2019 .
  55. ^ "ISO/IEC TS 21425:2017". Organización Internacional de Normalización. Archivado desde el original el 15 de enero de 2019 . Consultado el 15 de febrero de 2019 .
  56. ^ "ISO/IEC TS 22277:2017". Organización Internacional de Normalización. Archivado desde el original el 15 de enero de 2019 . Consultado el 15 de febrero de 2019 .
  57. ^ "ISO/IEC TS 19216:2018". Organización Internacional de Normalización. Archivado desde el original el 15 de enero de 2019 . Consultado el 15 de febrero de 2019 .
  58. ^ "ISO/IEC TS 21544:2018". Organización Internacional de Normalización. Archivado desde el original el 15 de enero de 2019 . Consultado el 15 de febrero de 2019 .
  59. ^ "ISO/IEC TS 19570:2018". Organización Internacional de Normalización. Archivado desde el original el 15 de enero de 2019 . Consultado el 15 de febrero de 2019 .
  60. ^ "ISO/IEC TS 23619:2021". Organización Internacional de Normalización. Archivado desde el original el 15 de diciembre de 2018 . Consultado el 11 de octubre de 2021 .
  61. ^ Consulte una lista en "Funciones experimentales de C++". cppreference.com . Archivado desde el original el 23 de noviembre de 2018 . Consultado el 15 de febrero de 2019 .
  62. ^ B. Stroustrup (entrevistado por Sergio De Simone) (30 de abril de 2015). "Stroustrup: Reflexiones sobre C++ 17: una entrevista". Archivado desde el original el 8 de julio de 2015 . Consultado el 8 de julio de 2015 .
  63. ^ Stroustrup, Bjarne (2000). El lenguaje de programación C ++ (edición especial). Addison-Wesley. pag. 46.ISBN _ 0-201-70073-5.
  64. ^ Stroustrup, Bjarne. "Problemas abiertos para el lenguaje de programación C++ (tercera edición)". Archivado desde el original el 5 de mayo de 2014 . Consultado el 5 de mayo de 2014 .
  65. ^ ISO / IEC . Lenguajes de programación: borrador C ++ 11 (n3797) Archivado el 2 de octubre de 2018 en Wayback Machine §3.7 Duración del almacenamiento [basic.stc]
  66. ^ ISO / IEC . Lenguajes de programación: borrador de C++11 (n3797) Archivado el 2 de octubre de 2018 en Wayback Machine §3.7.1 Duración del almacenamiento estático [basic.stc.static]
  67. ^ ISO / IEC . Lenguajes de programación: borrador de C++11 (n3797) Archivado el 2 de octubre de 2018 en Wayback Machine §3.7.2 Duración del almacenamiento del subproceso [basic.stc.thread]
  68. ^ ISO / IEC . Lenguajes de programación: borrador de C++11 (n3797) Archivado el 2 de octubre de 2018 en Wayback Machine §3.7.3 Duración del almacenamiento automático [basic.stc.auto]
  69. ^ ISO / IEC . Lenguajes de programación: borrador de C++11 (n3797) Archivado el 2 de octubre de 2018 en Wayback Machine §3.7.4 Duración del almacenamiento dinámico [basic.stc.dynamic]
  70. ^ "Directrices básicas de C++". isocpp.github.io . Archivado desde el original el 8 de febrero de 2020 . Consultado el 9 de febrero de 2020 .
  71. ^ ab "Nadie entiende C++: Parte 5: Inflación de código de plantilla". artículos.emptycrate.com/: Software VacuumCrate. Viajar. Cosa. 6 de mayo de 2008. Archivado desde el original el 25 de abril de 2016 . Consultado el 8 de marzo de 2010 . En ocasiones, leerá o escuchará a alguien hablar sobre las plantillas de C++ que provocan un exceso de código. Estaba pensando en ello el otro día y pensé: "Yo, si el código hace exactamente lo mismo, entonces el código compilado no puede ser más grande, ¿verdad?". [...] ¿Y qué pasa con el tamaño del código compilado? Cada uno fue compilado con el comando g++ <nombre de archivo>.cpp -O3. Versión sin plantilla: 8140 bytes, versión de plantilla: 8028 bytes.
  72. ^ Sutter, hierba ; Alexandrescu, Andrei (2004). Estándares de codificación de C++: 101 reglas, pautas y mejores prácticas . Addison-Wesley.
  73. ^ Henricson, esteras; Nyquist, Erik (1997). Fuerza industrial C++. Prentice Hall. ISBN 0-13-120965-5.
  74. ^ Stroustrup, Bjarne (2000). El lenguaje de programación C ++ (edición especial). Addison-Wesley. pag. 310.ISBN _ 0-201-70073-5. Una función miembro virtual a veces se denomina método .
  75. ^ "Expresiones lambda (desde C++ 11) - cppreference.com". es.cppreference.com . Consultado el 14 de diciembre de 2022 .
  76. ^ Mycroft, Alan (2013). "Excepciones de C y C++ | Plantillas" (PDF) . Laboratorio de Computación de Cambridge: materiales del curso 2013-14 . Archivado (PDF) desde el original el 13 de mayo de 2016 . Consultado el 30 de agosto de 2016 .
  77. ^ Stroustrup, Bjarne (2013). El lenguaje de programación C++ . Addison Wesley. pag. 345.ISBN _ 9780321563842.
  78. ^ Stroustrup, Bjarne (2013). El lenguaje de programación C++ . Addison Wesley. págs. 363–365. ISBN 9780321563842.
  79. ^ Stroustrup, Bjarne (2013). El lenguaje de programación C++ . Addison Wesley. págs.345, 363. ISBN 9780321563842.
  80. ^ "Guía de estilo de Google C++". Archivado desde el original el 16 de marzo de 2019 . Consultado el 25 de junio de 2019 .
  81. ^ "Estándares de codificación LLVM". Documentación LLVM 9 . Archivado desde el original el 27 de junio de 2019 . Consultado el 25 de junio de 2019 .
  82. ^ "Convenciones de codificación". QtWiki . Archivado desde el original el 26 de junio de 2019 . Consultado el 26 de junio de 2019 .
  83. ^ Stroustrup, Bjarne (2013). El lenguaje de programación C++ . Addison Wesley. págs.344, 370. ISBN 9780321563842.
  84. ^ Stroustrup, Bjarne (2013). El lenguaje de programación C++ . Addison Wesley. pag. 349.ISBN _ 9780321563842.
  85. ^ Graziano Lo Russo (2008). "Una entrevista con A. Stepanov". stlport.org . Archivado desde el original el 4 de marzo de 2009 . Consultado el 8 de octubre de 2015 .
  86. ^ "Directrices básicas de C++". isocpp.github.io . Archivado desde el original el 16 de febrero de 2020 . Consultado el 9 de febrero de 2020 .
  87. ^ "Bjarne Stroustrup anuncia las directrices básicas de C++: C++ estándar". isocpp.org . Archivado desde el original el 11 de mayo de 2020 . Consultado el 31 de marzo de 2020 .
  88. ^ "microsoft/GSL". 18 de julio de 2021. Archivado desde el original el 18 de julio de 2021 . Consultado el 18 de julio de 2021 a través de GitHub.
  89. ^ "Uso de los comprobadores de las directrices básicas de C++". Microsoft aprende . Archivado desde el original el 13 de agosto de 2021 . Consultado el 31 de marzo de 2020 .
  90. ^ "Resumen de ABI de C++". 20 de marzo de 2001. Archivado desde el original el 10 de julio de 2018 . Consultado el 30 de mayo de 2006 .
  91. ^ "Preguntas frecuentes de Bjarne Stroustrup: ¿Es C un subconjunto de C++?". Archivado desde el original el 6 de febrero de 2016 . Consultado el 5 de mayo de 2014 .
  92. ^ "C9X: el nuevo estándar C". Archivado desde el original el 21 de junio de 2018 . Consultado el 27 de diciembre de 2008 .
  93. ^ "Compatibilidad con C++ 0x en GCC". Archivado desde el original el 21 de julio de 2010 . Consultado el 12 de octubre de 2010 .
  94. ^ "Características principales del lenguaje C++ 0x en VC10: la tabla". Archivado desde el original el 21 de agosto de 2010 . Consultado el 12 de octubre de 2010 .
  95. ^ "Clang: estado de C ++ 98, C ++ 11 y C ++ 14". Clang.llvm.org. 12 de mayo de 2013. Archivado desde el original el 4 de julio de 2013 . Consultado el 10 de junio de 2013 .
  96. ^ "Re: [RFC] Convertir builin-mailinfo.c para usar The Better String Library" (lista de correo). 6 de septiembre de 2007. Archivado desde el original el 8 de marzo de 2021 . Consultado el 31 de marzo de 2015 .
  97. ^ "Re: ¿Esfuerzos para atraer más usuarios?" (Lista de correo). 12 de julio de 2010. Archivado desde el original el 21 de marzo de 2015 . Consultado el 31 de marzo de 2015 .
  98. ^ Andrew Binstock (18 de mayo de 2011). "Dr. Dobb's: entrevista con Ken Thompson". Archivado desde el original el 13 de marzo de 2014 . Consultado el 7 de febrero de 2014 .
  99. ^ ab Peter Seibel (16 de septiembre de 2009). Codificadores en el trabajo: reflexiones sobre el oficio de programar. Presione. págs. 475–476. ISBN 978-1-4302-1948-4. Archivado desde el original el 1 de diciembre de 2019 . Consultado el 9 de noviembre de 2017 .
  100. ^ ab "C ++ en codificadores en el trabajo". 16 de octubre de 2009. Archivado desde el original el 10 de noviembre de 2017 . Consultado el 9 de noviembre de 2017 .
  101. ^ ab "Una entrevista con Donald Knuth". Dr. Dobb . Archivado desde el original el 8 de marzo de 2021 . Consultado el 18 de julio de 2021 .
  102. ^ ab "Navegador (La)TeX". Archivado desde el original el 20 de noviembre de 2017 . Consultado el 10 de noviembre de 2017 .
  103. ^ Brian Kernighan (18 de julio de 2018). Preguntas y respuestas de Brian Kernighan: informático. Archivado desde el original el 25 de septiembre de 2021.
  104. ^ "Stroustrup: preguntas frecuentes". www.stroustrup.com . Archivado desde el original el 6 de febrero de 2016 . Consultado el 7 de junio de 2013 .
  105. ^ Lucio, Rob (2012). "Menos es exponencialmente más". Archivado desde el original el 7 de julio de 2017 . Consultado el 23 de noviembre de 2018 .
  106. ^ Kreinin, Yossi (13 de octubre de 2009). "C++ defectuoso". Archivado desde el original el 5 de febrero de 2016 . Consultado el 3 de febrero de 2016 .

Otras lecturas

enlaces externos