¿Características ocultas de C++? [cerrado]
¿No le encanta C++ cuando se trata de la línea de preguntas "características ocultas de"? Pensé que lo tiraría por ahí. ¿Cuáles son algunas de las características ocultas de C++?
La mayoría de los programadores de C++ están familiarizados con el operador ternario:
x = (y < 0) ? 10 : 20;
Sin embargo, no se dan cuenta de que se puede utilizar como valor l:
(a == 0 ? a : b) = 1;
que es una abreviatura de
if (a == 0)
a = 1;
else
b = 1;
Úselo con precaución :-)
Puede colocar URI en la fuente C++ sin errores. Por ejemplo:
void foo() {
http://stackoverflow.com/
int bar = 4;
...
}
Aritmética de punteros.
Los programadores de C++ prefieren evitar los punteros debido a los errores que pueden introducirse.
¿El C++ más genial que he visto jamás? Literales analógicos.
Estoy de acuerdo con la mayoría de las publicaciones allí: C++ es un lenguaje multiparadigma, por lo que las características "ocultas" que encontrará (aparte de los "comportamientos indefinidos" que debe evitar a toda costa) son usos inteligentes de las instalaciones.
La mayoría de esas instalaciones no son características integradas del lenguaje, sino basadas en bibliotecas.
El más importante es el RAII , a menudo ignorado durante años por los desarrolladores de C++ provenientes del mundo C. La sobrecarga de operadores es a menudo una característica mal entendida que permite un comportamiento similar a una matriz (operador de subíndice), operaciones similares a punteros (punteros inteligentes) y operaciones similares a integradas (matrices multiplicadoras).
El uso de excepciones suele ser difícil, pero con algo de trabajo, se puede producir un código realmente sólido a través de especificaciones de seguridad de excepciones (incluido el código que no fallará o que tendrá características similares a las de confirmación, es decir, que tendrá éxito o volverá a su estado original).
La característica "oculta" más famosa de C++ es la metaprogramación de plantillas , ya que le permite ejecutar su programa parcial (o totalmente) en tiempo de compilación en lugar de en tiempo de ejecución. Sin embargo, esto es difícil y debes tener un conocimiento sólido de las plantillas antes de intentarlo.
Otros hacen uso del paradigma múltiple para producir "formas de programación" fuera del antecesor de C++, es decir, C.
Al utilizar functores , puede simular funciones, con seguridad de tipos adicional y con estado. Usando el patrón de comando , puede retrasar la ejecución del código. La mayoría de los demás patrones de diseño se pueden implementar fácil y eficientemente en C++ para producir estilos de codificación alternativos que no se supone que estén dentro de la lista de "paradigmas oficiales de C++".
Al utilizar plantillas , puede producir código que funcionará en la mayoría de los tipos, incluido el que pensó al principio. También puede aumentar la seguridad de tipos (como un malloc/realloc/free seguro de tipos automatizado). Las características de los objetos de C++ son realmente poderosas (y por lo tanto, peligrosas si se usan descuidadamente), pero incluso el polimorfismo dinámico tiene su versión estática en C++: el CRTP .
He descubierto que la mayoría de los libros tipo " Effective C++ " de Scott Meyers o " Exceptional C++ " de Herb Sutter son fáciles de leer y contienen una gran cantidad de información sobre características conocidas y menos conocidas de C++.
Entre mis favoritos hay uno que debería hacer que a cualquier programador de Java se le erice el pelo del horror: en C++, la forma más orientada a objetos de agregar una característica a un objeto es a través de una función no miembro y no amiga, en lugar de una función miembro. función (es decir, método de clase), porque:
En C++, la interfaz de una clase son tanto sus funciones miembro como las funciones no miembro en el mismo espacio de nombres.
Las funciones no amigas y no miembros no tienen acceso privilegiado a la clase interna. Como tal, el uso de una función miembro en lugar de una que no sea miembro ni amiga debilitará la encapsulación de la clase.
Esto nunca deja de sorprender incluso a los desarrolladores experimentados.
(Fuente: Entre otros, Guru de la semana en línea #84 de Herb Sutter: http://www.gotw.ca/gotw/084.htm )
Una característica del lenguaje que considero algo oculta, porque nunca había oído hablar de ella durante todo mi tiempo en la escuela, es el alias del espacio de nombres. No me llamó la atención hasta que encontré ejemplos en la documentación de impulso. Por supuesto, ahora que lo sé, puedes encontrarlo en cualquier referencia estándar de C++.
namespace fs = boost::filesystem;
fs::path myPath( strPath, fs::native );