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 "