Contenido Checked

C ++

Temas relacionados: Programas de computadoras

Sabías ...

SOS Children hizo esta selección Wikipedia junto a otros recursos de escuelas . Visite el sitio web de Aldeas Infantiles SOS en http://www.soschildren.org/

C ++
C plus plus book.jpg
El C ++ Programming Language, escrito por su arquitecto, es el libro seminal sobre la lengua.
Paradigma (s) Multi-paradigma: procesal, funcional, orientado a objetos, genérico
Apareció en 1983
Diseñado por Bjarne Stroustrup
Revelador
  • Bjarne Stroustrup
  • Bell Labs
  • ISO / IEC JTC 1 / SC22 / WG21


Última versión estable ISO / IEC 14882: 2011 (2011)
Disciplina Typing Estática, inseguro, nominativo
Las principales implementaciones C ++ Builder, LLVM Clang, Comeau C / C ++, GCC, Intel C ++ Compiler, Microsoft Visual C ++, Sun Studio
Dialectos Embedded C ++, C ++ administrado, C ++ / CLI, C ++ / CX
Influenciado Perl , LPC, Lua, Pike, Ada 95, Java , PHP, D, C99, C #, Falcon, Seed7
OS Cruz-plataforma (multiplataforma)
Usual extensiones de archivos .h .hh .hpp .hxx .h ++ .cc .cpp .cxx .c ++
  • Noticias, el estado y la discusión sobre Standard C ++
  • C ++ Programming en Wikilibros

C ++ (pronunciado "ver plus plus") es una tipos estáticos, forma libre, multi-paradigma, compilado, de uso general lenguaje de programación . Es considerado como un lenguaje de nivel intermedio, ya que comprende tanto de alto nivel y bajo nivel de las características del lenguaje. Desarrollado por Bjarne Stroustrup a partir de 1979 en Bell Labs, C ++ fue nombrado originalmente C con clases, añadiendo características orientadas a objetos, tales como clases, y otras mejoras en el lenguaje de programación C . El idioma fue rebautizado C ++ en 1983, como un juego de palabras que implica la operador de incremento.

C ++ es uno de los lenguajes de programación más populares y se lleva a cabo en una amplia variedad de plataformas de hardware y sistemas operativos. Como compilador eficiente a código nativo, sus ámbitos de aplicación incluyen el software de sistemas, software de aplicaciones, controladores de dispositivos, software embebido, de servidor de alto rendimiento y aplicaciones cliente y software de entretenimiento como los videojuegos . Varios grupos proporcionan tanto libre como propietario y C ++ software compilador, incluyendo el Proyecto GNU, Microsoft, Intel y Embarcadero Technologies. C ++ ha influido enormemente en muchos otros lenguajes de programación, sobre todo C # y Java . Otros idiomas exitosos como Objective-C utiliza una muy diferente sintaxis y enfoque para agregar clases de C .

C ++ también se utiliza para diseño de hardware, donde el diseño se describe inicialmente en C ++, a continuación, analizó, arquitectónicamente limitado, y programado para crear un a nivel de registros de transferencia Lenguaje de descripción de hardware a través de síntesis de alto nivel.

El lenguaje comenzó como mejoras en C , añadiendo primero clases, entonces funciones virtuales, sobrecarga de operadores, herencia múltiple, plantillas y manejo de excepciones, entre otras características. Después de años de desarrollo, el estándar del lenguaje de programación C ++ fue ratificado en 1998 como ISO / IEC 14882 : 1998. El estándar fue modificado por la técnica 2003 corrección de errores, ISO / IEC 14882: 2003. El estándar actual se extiende C ++ con nuevas características fue ratificado y publicado por ISO en septiembre de 2011 como ISO / IEC 14882 : 2011 (informalmente conocido como C ++ 11).

Historia

Bjarne Stroustrup, creador de C ++

Bjarne Stroustrup, un científico de la computación entrenados danesa y británica, comenzó su trabajo en "C con clases" en 1979. La idea de crear un nuevo lenguaje se originó a partir de la experiencia de Stroustrup en la programación para su Ph.D. tesis. Stroustrup encontró que Simula tenía características que fueron muy útiles para el desarrollo de software grande, pero el lenguaje era demasiado lento para un uso práctico, mientras que BCPL era rápido pero muy bajo nivel para ser adecuados para el desarrollo de software de gran tamaño. Cuando Stroustrup comenzó a trabajar en AT & T Bell Labs, que tenía el problema de analizar el UNIX núcleo con respecto a computación distribuida. Recordando su Ph.D. experiencia, Stroustrup se propuso mejorar la C lenguaje con Simula características similares. C fue elegido porque era de uso general, rápido, portátil y ampliamente utilizado. Además de C y Simula, algunos otros idiomas que inspiraron él fueron ALGOL 68, Ada, CLU y ML. En un primer momento, la clase, la clase derivada, tipado fuerte, inlining, y características de los argumentos por defecto se añadieron a C vía C de Stroustrup ++ para compilador C, Cfront. La primera implementación comercial de C ++ fue puesto en libertad el 14 de octubre de 1985.

En 1983, el nombre de la lengua fue cambiado de C con clases de C ++ (++ siendo el operador de incremento en C). Se han añadido nuevas características que incluyen funciones virtuales, nombre de la función y sobrecarga de operadores, las referencias, las constantes, control controlado por el usuario sin almacenamiento de memoria, mejora la comprobación de tipos, y el estilo BCPL de una sola línea, comenta con dos barras inclinadas ( // ). En 1985, la primera edición de El Lenguaje de Programación C ++ fue puesto en libertad, proporcionando una referencia importante a la lengua, ya que aún no era una norma oficial. Versión 2.0 de C ++ se produjo en 1989 y la segunda edición actualizada de The C ++ Programming Language fue lanzado en 1991. Las nuevas características incluidas herencia múltiple, clases abstractas, funciones miembro estáticas, métodos constantes y miembros protegidos. En 1990, se publicó La Anotado C ++ Reference Manual. Este trabajo se convirtió en la base para la futura norma. Nuevas características mora incluido plantillas, excepciones, espacios de nombres, nuevo yesos y un Tipo booleano.

Como el lenguaje C ++ evolucionaba, la biblioteca estándar evolucionado con él. La primera adición a la biblioteca estándar de C ++ fue el reproduzco biblioteca E / S que proporciona facilidades para reemplazar las funciones de C tradicionales como printf y scanf. Más tarde, entre las adiciones más significativas a la biblioteca estándar, había una gran cantidad de la Biblioteca de plantillas estándar.

C ++ se llama a veces un lenguaje híbrido.

Es posible escribir orientado a objetos o código de procedimiento en el mismo programa en C ++. Esto ha causado cierta preocupación de que algunos programadores de C ++ todavía están escribiendo código de procedimiento, pero están bajo la impresión de que está orientado a objetos, simplemente porque están usando C ++. A menudo, es una fusión de los dos. Esto por lo general causa la mayoría de los problemas cuando se revisa el código o la tarea es asumida por otro codificador.

C ++ se sigue utilizando y es uno de los lenguajes de programación preferidos para desarrollar aplicaciones profesionales.

Etimología

Según BS: "el nombre significa la naturaleza evolutiva de los cambios de C". Durante el período de desarrollo C ++ 's, el idioma había sido referido como "nuevo C", luego "C con clases". El nombre final se acredita a Rick Mascitti (mediados de 1983) y fue utilizado por primera vez en diciembre de 1983. Cuando Mascitti fue interrogado de manera informal en 1992 sobre el nombramiento, que indicaron que se le dio en un espíritu lengua en la mejilla. Se deriva de "++" de C operador (que incrementa el valor de una variable) y un común nombrando convención de usar "+" para indicar un programa informático mejorado. Una broma que sucede que el nombre en sí tiene un error: debido al uso de puesto -increment, que incrementa el valor de la variable, pero se evalúa al valor unincremented, C ++ no es mejor que C, y el pre-incremento ++ C forma debería haberse utilizado en su lugar. No hay un lenguaje llamado "C plus". ABCL / c + era el nombre de un lenguaje de programación no relacionados anteriormente. Algunos otros idiomas han sido nombrados de manera similar a C ++, sobre todo C- y C #.

Estandarización

Año C ++ estándar Nombre informal
1998 ISO / IEC 14882: 1998 C ++ 98
2003 ISO / IEC 14882: 2003 C ++ 03
2007 ISO / IEC TR 19768: 2007 C ++ TR1
2011 ISO / IEC 14882: 2011 C ++ 11

En 1998, el comité de estándares de C ++ (la ISO / IEC JTC 1 / SC22 / WG21 grupo de trabajo) estandarizado C ++ y publicada la norma internacional ISO / IEC 14882: 1998 (informalmente conocido como C ++ 98). Durante algunos años después del lanzamiento oficial de la norma, el comité procesa informes de defectos, y en 2003 publicó una versión corregida del estándar de C ++, ISO / IEC 14882: 2003. En 2005, un informe técnico, llamado el " Informe Biblioteca Técnica 1 "(a menudo conocido como TR1 para abreviar), fue puesto en libertad. Aunque no es una parte oficial de la norma, se especifica un número de extensiones a la biblioteca estándar, que se espera que sea incluido en la próxima versión de C ++.

La última revisión importante del estándar de C ++, C ++ 11, (anteriormente conocido como C ++ 0x) fue aprobado por la ISO / CEI el 12 de agosto de 2011. Se ha publicado como 14882: 2011. Hay planes para un menor (C ++ 14) y una revisión a fondo (C ++ 17) en el futuro.

C ++ 14 es el nombre que se utiliza para la próxima revisión. Está previsto C ++ 14 para ser una pequeña extensión de más de C ++ 11, que ofrece principalmente correcciones de errores y pequeñas mejoras, de manera similar a la forma en C ++ 03 fue una pequeña extensión en C ++ 98. Mientras que el "C ++ 14 'implica una liberación en 2014, esta fecha no es fija.

Filosofía

En El Diseño y Evolución de C ++ (1994), Bjarne Stroustrup describe algunas reglas que ha utilizado para el diseño de C ++:

  • C ++ está diseñado para ser una estáticamente lenguaje de tipos, de propósito general que es tan eficiente y portátil como C
  • C ++ está diseñado para apoyar directamente y de forma global múltiples estilos de programación ( programación procedimental, abstracción de datos, programación orientada a objetos, y programación genérica)
  • C ++ está diseñado para dar la elección programador, incluso si esto hace que sea posible para el programador para elegir incorrectamente
  • C ++ está diseñado para ser compatible con C tanto como sea posible, por lo tanto, proporcionar una transición suave de C
  • C ++ evita características que son específicas de la plataforma o propósito no generales
  • C ++ no incurre sobrecarga de funciones que no se utilizan (el "principio de cero gastos generales")
  • C ++ está diseñado para funcionar sin un entorno de programación sofisticada

En el interior del C ++ Object Model (Lippman, 1996) describe cómo los compiladores pueden convertir programa en C ++ declaraciones en un diseño en memoria. Autores del compilador son, sin embargo, la libertad de aplicar la norma a su manera.

Biblioteca estándar

El 1998 ANSI / ISO C ++ estándar consta de dos partes: la núcleo del lenguaje y la C ++ Standard Library; este último incluye la mayor parte de la Biblioteca Standard Template (STL) y una versión ligeramente modificada de la biblioteca estándar de C. Existen muchas bibliotecas de C ++ que no son parte de la norma, y, usando la especificación de vinculación, bibliotecas, incluso pueden ser escritos en lenguajes como BASIC , C , Fortran, o Pascal. ¿Cuál de estos cuentan con el apoyo del compilador es dependiente.

La biblioteca estándar de C ++ incorpora la biblioteca estándar de C con algunas pequeñas modificaciones para que sea optimizado con el lenguaje C ++. Otra gran parte de la biblioteca de C ++ se basa en la STL. Esto proporciona herramientas útiles tales como contenedores (por ejemplo vectores y listas), iteradores para proporcionar estos contenedores con el acceso y la matriz como algoritmos para realizar operaciones tales como búsqueda y clasificación. Además (multi) mapas ( matrices asociativas) y (multi conjuntos) se proporcionan, todos los cuales interfaces compatibles exportación. Por lo tanto es posible, el uso de plantillas, para escribir algoritmos genéricos que funcionan con cualquier contenedor o en cualquier secuencia definida por los iteradores. Al igual que en C, la características de la biblioteca se accede mediante el uso de la #include Directiva para incluir una encabezado estándar. C ++ proporciona 105 cabeceras estándar, de los cuales 27 están en desuso.

El STL fue originalmente una biblioteca de terceros de HP y más tarde SGI, antes de su incorporación en el estándar de C ++. El arquitecto principal detrás de la STL es Alexander Stepanov, que experimentó con algoritmos genéricos y contenedores para muchos años. Cuando empezó con C ++, finalmente encontró un lenguaje en el que era posible crear algoritmos genéricos (por ejemplo, STL especie) que realizan incluso mejor que, por ejemplo, la qsort biblioteca estándar de C, gracias a C ++ características como el uso de procesos en línea y de compilación vinculante tiempo en lugar de punteros de función. La norma no se refiere a ella como "STL", ya que no es más que una parte de la biblioteca estándar, pero el término es aún ampliamente utilizado para distinguirlo del resto de la biblioteca estándar (entrada / flujo de salida, de internacionalización, diagnósticos, el subconjunto de la biblioteca C, etc.).

La mayoría de los compiladores de C ++ proporcionan una implementación de la biblioteca estándar de C ++, incluyendo la STL. También existen implementaciones del compilador independiente de la STL, como STLport,. Otros proyectos también producen diversas implementaciones personalizadas de la biblioteca de C ++ estándar y la STL con varios objetivos de diseño.

Características del lenguaje

C ++ hereda la mayor parte de La sintaxis de C. La siguiente es la versión de Bjarne Stroustrup de la Hola mundo que utiliza el Instalación corriente biblioteca estándar C ++ para escribir un mensaje a salida estándar:

 # Include 
 
 int main ()
 {
    std :: cout << "Hola, mundo! \ n";
 }

Dentro de las funciones que definen un tipo de retorno no vacío, no devolver un valor antes del control llega al final de los resultados de la función en comportamiento indefinido (compiladores suelen proporcionar los medios para emitir un diagnóstico en este caso). La única excepción a esta regla es la main función, que devuelve de forma implícita un valor de cero.

Los operadores y la sobrecarga de operadores

Los operadores que no pueden ser sobrecargados
Operador Símbolo
Operador de resolución de ámbito ::
Operador condicional ?:
operador punto .
Operador de selección de miembros . *
Operador "sizeof" tamaño de
Operador "typeid" typeid

C ++ proporciona más 35 operadores, que abarca la aritmética básica, manipulación de bits, indirecto, comparaciones, operaciones lógicas y otros. Casi todos los operadores pueden ser sobrecarga para los tipos definidos por el usuario, con algunas excepciones notables, como acceso de miembros ( . y .* ), así como el operador condicional. El rico conjunto de operadores sobrecargable es fundamental para el uso de C ++ como específica del dominio del idioma. Los operadores sobrecargable también son una parte esencial de muchas técnicas avanzadas de programación C ++, como punteros inteligentes. La sobrecarga un operador no cambia la prioridad de los cálculos relativos a la operadora, ni cambia el número de operandos que utiliza el operador (cualquier operando sin embargo pueden ser ignorados por el operador, a pesar de que será evaluado antes de la ejecución). Sobrecargado " && "y" || "operadores pierden su cortocircuito propiedad evaluación.

Gestión de la memoria

C ++ soporta cuatro tipos de gestión de memoria:

  • Asignación de memoria estática. La variable estática se asigna un valor en tiempo de compilación y almacenamiento asignado en una ubicación fija junto con el código ejecutable. Éstos se declaran con la palabra clave "estática" (en el sentido de almacenamiento estático, no en el sentido de declarar un variable de clase).
  • Asignación de memoria automática. Una variable automática se declaró simplemente con su nombre de clase, y el almacenamiento es asignado en la pila cuando se asigna el valor. El constructor se llama cuando se ejecuta la declaración, el destructor se llama cuando la variable sale del ámbito, y después de que el destructor de la memoria asignada se liberará automáticamente.
  • Asignación dinámica de memoria. El almacenamiento se puede asignar dinámicamente en el amontonarán usando gestión de memoria manual - llama normalmente a nuevo y eliminar (aunque todavía se admiten llamadas de viejo estilo C como malloc () y free ()).
  • Con el uso de una biblioteca, recolección de basura es posible. La Recolector de basura Boehm se utiliza comúnmente para este propósito.

El control preciso de la gestión de memoria es similar a C, pero en contraste con las lenguas que tengan la intención de ocultar estos detalles de la programación, como Java, Perl, PHP y Ruby.

Plantillas

Plantillas de C ++ permiten programación genérica. C ++ soporta ambas plantillas de función y de clase. Las plantillas pueden ser parametrizados en tipos, constantes de tiempo de compilación, y otras plantillas. Plantillas de C ++ son implementados por instancias en tiempo de compilación. Para crear una instancia de una plantilla, los compiladores sustituir argumentos específicos para los parámetros de una plantilla para generar una función concreta o instancia de clase. Algunas sustituciones no son posibles; éstos son eliminados por una política de resolución de sobrecarga descrito por la frase " Insuficiencia sustitución no es un error "(SFINAE). Las plantillas son una herramienta poderosa que se puede utilizar para programación genérica, metaprogramming plantilla, y la optimización del código, pero este poder implica un costo. Uso de plantillas puede aumentar el tamaño del código, porque cada instancia plantilla produce una copia del código de la plantilla: uno para cada conjunto de argumentos de plantilla. Esto está en contraste para funcionar en tiempo genéricos visto en otros idiomas (por ejemplo, Java), donde en tiempo de compilación el tipo se borra y un solo cuerpo de la plantilla se conserva.

Las plantillas son diferentes de macros: mientras que estas dos 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 son conscientes de la semántica y el tipo de sistema de su lengua compañero, así como todas las definiciones de tipos en tiempo de compilación, y pueden realizar operaciones de alto nivel que incluye control de flujo programático basado en la evaluación de los parámetros estrictamente controladas a escribir. Las macros son capaces de control condicional sobre compilación, basada en criterios predeterminados, pero no se pueden crear instancias de nuevos tipos, recurse, o llevar a cabo la evaluación tipo y, en efecto, se limitan a la validez de la compilación del texto de sustitución y texto inclusión / exclusión. En otras palabras, las macros pueden controlar el flujo de compilación basado en símbolos predefinidos, pero no pueden, a diferencia de plantillas, una instancia independiente nuevos símbolos. Las plantillas son una herramienta para la estática polimorfismo (ver abajo) y programación genérica.

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

En resumen, una plantilla es una función con parámetros de tiempo de compilación o clase escrita sin el conocimiento de los argumentos específicos que se utilizan para crear instancias de ella. Después 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 disociar aspectos genéricos, de aplicación amplia de funciones y clases (codificados en plantillas) de aspectos específicos (codificados en los parámetros de plantilla) sin sacrificar el rendimiento debido a la abstracción.

Objetos

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

La encapsulación

La encapsulación es el ocultamiento de la información para asegurar que las estructuras de datos y los operadores se utilizan según lo previsto y para hacer que el modelo de uso más obvio para el desarrollador. C ++ proporciona la capacidad de definir las clases y funciones como sus mecanismos de encapsulación primarios. Dentro de una clase, los miembros pueden ser declarados como bien público, protegido o privado para hacer cumplir de manera explícita la encapsulación. Un miembro del público de la clase es accesible a cualquier función. Un miembro privado es accesible sólo para las funciones que son miembros de esa clase y en las funciones y clases de permiso de acceso otorgado explícitamente por la clase ("amigos"). Un miembro protegido es accesible a los miembros de las clases que heredan de la clase, además de la clase y los de sus amigos.

El principio OO es que todas las funciones (y sólo las funciones) que acceden a la representación interna de un tipo debe estar encapsulados dentro de la definición de tipo. C ++ soporta este (a través de las funciones miembro y funciones friend), pero no hace cumplir: el programador puede declarar la totalidad o parte de la representación de un tipo a ser público, y se le permite hacer las entidades públicas que no forman parte de la representación de el tipo. Por lo tanto, C ++ soporta no sólo la programación OO, pero otros paradigmas de descomposición más débiles, como programación modular.

En general, se considera una buena práctica para hacer todo datos privados o protegidos, y hacer públicas sólo aquellas funciones que son parte de una interfaz mínima para los usuarios de la clase. Esto puede ocultar los detalles de implementación de datos, que permite al diseñador cambiar más adelante fundamentalmente la aplicación sin cambiar la interfaz de ninguna manera.

Herencia

La herencia permite un tipo de datos para adquirir propiedades de otros tipos de datos. La herencia de una clase base puede ser declarado como público, protegido o privado. Esta especificación de acceso determina si las clases no relacionadas y derivadas pueden acceder los miembros públicos y protegidos heredados de la clase base. Sólo patrimonio público 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 un "struct" hereda públicamente. Las clases base pueden ser declarados como virtuales; se llama herencia virtual. Herencia virtual asegura que sólo existe una instancia de una clase base en la gráfica de herencia, evitar algunos de los problemas de ambigüedad de la herencia múltiple.

La herencia múltiple es un C ++ no característica que se encuentra en la mayoría de otros idiomas, lo que permite una clase que se derivan de más de clases base; esto permite relaciones de herencia más elaboradas. Por ejemplo, una clase de "Flying Gato" puede heredar de ambos "gato" y "mamífero que vuela". Algunos otros idiomas, como el C # o Java , logran algo similar (aunque más limitado) al permitir que la herencia de múltiples interfaces de tiempo que restringe el número de clases base a uno (interfaces, a diferencia de clases, sólo ofrecen declaraciones de funciones miembro, sin datos de ejecución o miembros). Una interfaz como en C # y Java se puede definir en C ++ como una clase que contiene funciones virtuales puras sólo, a menudo conocido como clase base abstracta o "ABC". Las funciones miembro de una clase base abstracta como se definen normalmente de forma explícita en la clase derivada, no heredan implícitamente. Herencia virtual C ++ exhibe una característica de resolución de ambigüedades llamada dominación.

Polimorfismo

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

C ++ es compatible con varios tipos de estática ( en tiempo de compilación) y dinámica ( tiempo de ejecución) polimorfismos. Tiempo de compilación polimorfismo no permite ciertas decisiones en tiempo de ejecución, mientras que el polimorfismo en tiempo de ejecución normalmente incurre en una penalización de rendimiento.

Polimorfismo estático

La sobrecarga de funciones permite a los programas declaran múltiples funciones con el mismo nombre (pero con diferentes argumentos). Las funciones se distinguen por el número o el tipo de su parámetros formales. Así, el mismo nombre de la función se puede referir a diferentes funciones dependiendo del contexto en el que se utiliza. El tipo devuelto por la función no se utiliza para distinguir las funciones sobrecargadas y daría como resultado un mensaje de error de tiempo de compilación.

Al declarar una función, un programador puede especificar para uno o más parámetros a valor por defecto. Si lo hace, permite que los parámetros con valores predeterminados para opcionalmente omitirse cuando la función es llamada, en cuyo caso se utilizarán los argumentos por defecto. Cuando una función se llama con menos argumentos que allí se declaran parámetros, argumentos explícitos se hacen coincidir con los parámetros en orden de izquierda a derecha, con los parámetros incomparables al final de la lista de parámetros se asignan sus argumentos por defecto. En muchos casos, la especificación de argumentos predeterminados en una única declaración de la función es preferible proporcionar definiciones de funciones sobrecargadas con diferentes números de parámetros.

Plantillas en C ++ proporcionan un mecanismo sofisticado para escribir genérico, código polimórfico. En particular, a través de la Curiosamente modelo del modelo del recurrente, es posible implementar una forma de polimorfismo estático que imita la sintaxis para anular las funciones virtuales. Dado que las plantillas C ++ son de tipo conscientes y Turing-completo, también se pueden usar para que los condicionales recursivas compilador resolver y generar programas sustanciales a través de metaprogramming plantilla. Contrariamente a algunas opiniones, código de la plantilla no generará un código mayor después de la compilación con la configuración del compilador adecuados.

Polimorfismo dinámico

Herencia

Punteros variables (y referencias) a un tipo de clase base en C ++ pueden referirse a los objetos de las clases derivadas de ese tipo, además de objetos que coinciden exactamente el tipo de variable. Esto permite que las matrices y otros tipos de recipientes para punteros a objetos de diferentes tipos. Debido a que la asignación de valores a las variables por lo general ocurre en tiempo de ejecución, esto es necesariamente un fenómeno de tiempo de ejecución.

C ++ también proporciona un dynamic_cast operador, lo que permite que el programa intenta de forma segura conversión de un objeto en un objeto de un tipo de objeto más específico (en oposición a la conversión a un tipo más general, que siempre está permitido). Esta característica se basa en información de tipo en tiempo de ejecución (RTTI). Objetos que se sabe que de cierto tipo específico también se pueden lanzar a ese tipo con static_cast , una construcción puramente tiempo de compilación que es más rápido y no requiere RTTI.

Funciones miembro virtuales

Normalmente, cuando una función en una clase derivada anula una función en una clase base, la función a llamar es determinado por el tipo de objeto. Una función dada se anula cuando no existe ninguna 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 del objeto y por lo tanto la función correcta para llamar, dado sólo un puntero clase base; Por lo tanto, la decisión se pospone hasta que el tiempo de ejecución. Se llama envío dinámico. Funciones miembro virtuales o métodos permiten la implementación más específica de la función que se llama, de acuerdo con el tipo real de tiempo de ejecución del objeto. En implementaciones de C ++, esto se realiza comúnmente utilizando tablas de funciones virtuales. Si se conoce el tipo de objeto, esto puede ser evitado anteponiendo nombre completo de la clase antes de la llamada a la función, pero en las llamadas generales a funciones virtuales se resuelven en tiempo de ejecución.

Además de las funciones miembro estándar, sobrecargas y destructores de operador pueden ser virtuales. Una regla general es que si cualquiera de las funciones de la clase son virtuales, el destructor debe ser así. A medida que el tipo de un objeto en su creación se conoce en tiempo de compilación, constructores, y por constructores de copia de extensión, no puede ser virtual. Sin embargo puede surgir una situación donde necesita una copia de un objeto que se crea cuando un puntero a un objeto derivado se pasa como un puntero a un objeto de base. En tal caso, una solución común es crear un clone() (o similar) función virtual que crea y devuelve una copia de la clase derivada cuando se le llama.

Una función miembro también se puede hacer "puro virtual" mediante la anexión de = 0 después del paréntesis de cierre y antes del punto y coma. Una clase que contiene una función virtual pura se llama un tipo de datos abstracto. Los objetos no se pueden crear a partir de tipos abstractos de datos; que sólo se pueden derivar de. Cualquier clase derivada hereda la función virtual pura y debe proporcionar una definición no puro de ella (y todas las demás funciones virtuales puras) antes de objetos de la clase derivada se pueden crear. Un programa que intenta crear un objeto de una clase con una función miembro virtual pura o función miembro virtual pura heredado es mal formada.

Compatibilidad

La producción de un compilador razonablemente compatible con los estándares C ++ ha demostrado ser una tarea difícil para los fabricantes de compiladores en general. Durante muchos años, los distintos compiladores de C ++ en práctica el lenguaje C ++ para diferentes niveles de cumplimiento a la norma, y sus implementaciones variaron ampliamente en algunas zonas, como especialización de plantilla parcial. Las últimas versiones de compiladores más populares C ++ soportan casi todo el estándar C ++ 1998.

Para dar compilador proveedores de mayor libertad, el comité de estándares de C ++ decidió no dictar la ejecución de nombrar mangling, manejo de excepciones, y otras características específicas de la implementación. La desventaja de esta decisión es que código objeto producido por diferentes Se espera que los compiladores ser incompatibles. Había, sin embargo, los intentos de estandarizar compiladores para máquinas particulares o sistemas operativos (por ejemplo C ++ ABI), aunque parecen ser en gran parte abandonadas ahora.

Plantillas exportados

Un punto de discusión en particular es la export de palabras clave, destinado a permitir definiciones de plantillas de ser separados de sus declaraciones. El primer compilador ampliamente disponibles para poner en práctica export era Comeau C / C ++, a principios de 2003 (cinco años después de la publicación de la norma); en 2004, el compilador beta de Borland C ++ Builder X también fue lanzado con export . Ambos de estos compiladores se basan en el EDG C ++ parte delantera. Otros compiladores tales como GCC no apoyan en absoluto. A partir ANSI C ++ por Ivor Horton proporciona código de ejemplo con la palabra clave que no se compilará en la mayoría de los compiladores, sin hacer referencia a este problema. Hierbas Sutter, ex coordinador del comité de estándares de C ++, recomienda que export se retira de las futuras versiones del estándar C ++. Durante la normas ISO C ++ reunión de marzo de 2010, el comité de estándares de C ++ votó a favor de eliminar las plantillas exportados por completo de C ++ 11, pero nos reservamos la palabra clave para su uso futuro.

Con C

C ++ se considera a menudo ser un superconjunto de C , pero esto no es estrictamente cierto. La mayoría del código C se puede hacer fácilmente para compilar correctamente en C ++, pero hay algunas diferencias que hacen que algo de código C válido para ser inválida o se comportan de manera diferente en C ++.

Una diferencia comúnmente encontrado es que C permite la conversión implícita de void* a otros tipos de puntero, pero C ++ no lo hace. Otro problema común es que la portabilidad C ++ define muchas palabras clave nuevas, como new y class , que pueden ser usados como identificadores (por ejemplo, los nombres de variables) en un programa C.

Algunas incompatibilidades se eliminaron mediante la revisión de 1999 de la norma C ( C99), que ahora es compatible con funciones de C ++ como líneas de comentario ( // ), y declaraciones mixtos y código. Por otro lado, C99 introdujo una serie de nuevas características que C ++ no apoyaba, como arrays de longitud variable, tipos nativos de números complejos, inicializadores designados y literales compuestas. Sin embargo, se incluyeron al menos algunas de las características introducidas-C99 en la versión posterior de la norma C ++, C ++ 11:

  • C99 preprocesador (incluyendo macros variadic, concatenación literal ancho / estrecho, más amplios aritmética de enteros)
  • _Pragma ()
  • largo largo
  • __func__
  • Encabezados:
    • cstdbool ( stdbool.h )
    • cstdint ( stdint.h )
    • cinttypes ( inttypes.h ).

Para entremezclar código C y C ++, cualquier declaración o definición de función que se va a llamar desde / utilizado tanto en C y C ++ se deben declarar con C vinculación colocándolo dentro de un extern "C" {/*...*/} bloque . Tal función puede no depender de las características en función de nombre mangling (es decir, la sobrecarga de funciones).

Crítica

Debido a su gran conjunto de características y sintaxis "estricta" a menudo percibida, la lengua es a veces criticado por ser demasiado complicado y por lo tanto difícil de adquirir dominio.

C ++ a veces se comparan desfavorablemente con más estrictamente orientadas a objetos idiomas sobre la base que permite a los programadores "mezclar y combinar" declarativo, funcional, genérico, modular, y estilos de programación de procedimiento con programación orientada a objetos, en lugar de la aplicación estricta de un solo estilo, aunque C ++ es intencionalmente un lenguaje multi-paradigma. También carece de algunas características como reflexión, aunque la adición de este último se ha contemplado.

Un artículo satírico ampliamente distribuido retratado Bjarne Stroustrup, entrevistado para un tema de la IEEE revista Computer 1998, confesando que C ++ fue diseñado deliberadamente para ser complejo y difícil, eliminar a los programadores aficionados y elevar los salarios de los pocos programadores que podría dominar el idioma. La sección de preguntas frecuentes del sitio web personal de Stroustrup contiene una negación y un enlace a la entrevista.

Richard Stallman critica C ++ para tener gramática ambigua y ", incompatibilidades triviales gratuitos con C [...] que no son de gran beneficio". Linus Torvalds dijo en una famosa correo electrónico que C ++ era un "lenguaje terrible '.

Por último, varios autores han señalado que C ++ no es un verdadero lenguaje orientado a objetos.

El mismo problema ocurre con los lenguajes de programación. Como se dijo anteriormente, muchos programadores de C trasladaron al ámbito de la orientación a objetos mediante la migración a C ++ antes de ser expuestos directamente a los conceptos OO. Esto siempre saldría en una entrevista. Muchas veces los desarrolladores que dicen ser programadores de C ++ son simplemente los programadores de C utilizando compiladores de C ++. [...] Ya hemos mencionado que C ++ no es un lenguaje de programación orientado a objetos cierto, pero en realidad es un lenguaje de programación basado en objetos. Recuerde que C ++ se considera que es basado en objetos. Conceptos orientados a objetos no se hacen cumplir. Usted puede escribir un programa no orientado a objetos C utilizando un compilador de C ++.
-Matt Weisfeld,
Es interesante ver lo que se está haciendo en el mundo bajo el nombre de objeto-orientado. Se me ha mostrado algunos muy, muy extrañas piezas en busca de código a través de los años, por varias personas, incluidas las personas en las universidades, que han dicho es programación orientada a objetos escrito en un lenguaje de programación orientada a objetos, y en realidad me inventé el término orientado a objetos, y te puedo decir, yo no tenía C ++ en mente.
- Alan Kay, Smalltalk co-creador,
Recuperado de " http://en.wikipedia.org/w/index.php?title=C%2B%2B&oldid=555926964 "