He leído bastantes libros para principiantes en C++, y un poco más allá, pero ¿cuáles son algunos de los aspectos más oscuros de C++, o dónde puedo encontrar información/tutoriales sobre estos?¿Cuáles son algunas de las partes más oscuras de C++?
Respuesta
Los libros de Herb Sutter son una fuente excelente para este tema: comience con http://www.gotw.ca/publications/xc++.htm.
El aforismo para las características candidatas es "no lo necesitas con mucha frecuencia, pero cuando lo necesitas, lo necesitas mal".
- Colocación nueva
- extern "C++"
- clases locales
- std :: asignador
- mutable, explícita, volátil
- puntero-a-cualquier-miembro-de-Any- clase
Por lo tanto, para las personas que han tenido razones para usar estas características (autores de la biblioteca), no estarán oscurecidas e, y para la mayoría de los programadores de C++, serán desconocidos.
Actualmente se preocupan por bad_alloc.
no?
Edit: lo que quiero decir es que en muchos de los a veces grandes proyectos de C++ en los que he tenido el placer de corregir errores, el concepto de atrapar bad_alloc y actuar sobre él ha desaparecido. Eso lo pondría en la parte "oscura" de C++, aunque no debería ser así.
¿Qué harías si algo realmente arrojara bad_alloc? No hay recuperación posible, y de hecho, la caja que está ejecutando el programa probablemente se haya bloqueado mucho antes de que se haya lanzado un bad_alloc. –
Depende del contexto. ¿Cuál fue el motivo de la asignación fallida? ¿Tamaño? ¿De dónde vino el tamaño? Algunos sistemas pueden usar una estrategia alternativa o necesitan alguna estrategia de degradación elegante, o simplemente liberar algo de memoria.Algunos sistemas necesitan salir bien con la registración informativa. En ningún caso está bien comprobar si hay un puntero nulo sin usar std :: nothrow, que ha sido el caso varias veces. Además, ¿por qué crees que la caja se habría bloqueado necesariamente? – FeatureCreep
En realidad, después de leer esto -> http://www.gotw.ca/publications/mill16.htm, especialmente la parte sobre la siniestra asignación perezosa en Linux, puedo ver de dónde viene tu argumento. Y se aplica en algunos de los casos que he visto, aunque no en todos, ya que he visto esto en sistemas integrados en los que las transferencias de datos fallaron debido a que el tamaño es malo, y la verificación nullpointer siempre es incorrecta. Pero veo tu punto, creo. – FeatureCreep
Template metaprogramming (todo un lenguaje de programación little-Turing completa en C++ ejecutado por el compilador) y los cortes con el preprocesador puede ser muy duro! (Incluso puede crear una sintaxis completamente nueva con esto - simplemente eche un vistazo a boost::lambda
)
Pero creo que lo más importante para aprender y comprender es la biblioteca STL (biblioteca estándar de C++) que es inevitablemente útil pero puede parecer un tanto extraña .
Todos los libros explican las excepciones.
Pero muy pocos hablan sobre la excepción de seguridad y los beneficiarios de la excepción.
Cómo utilizar RAII (indicadores inteligentes de fácil ejemplo) para hacer que su código de excepción sea seguro.
Cuáles son las garantías de excepción que debe proporcionar.
- Destructor debe beneficiarse de que no escapen excepciones.
- Varios de los algoritmos de STL utilizan cosas como swap, que también deben evitar excepciones para que el destinatario pueda funcionar correctamente en todas las situaciones.
- etc ...
Por el contrario, bastantes libros hablan de la seguridad y las garantías de excepción, en particular (pero no se limitan a) las de Herb Sutter. –
No es tan obvio es la aplicación de ciertos métodos en términos de otros métodos.
Operador de asignación:
-> implementar como una copia de la construcción y el intercambio.
operador +
-> implementado como construcción copia y el operador + =
operador =
-> poner en práctica en términos de operador ==
etc ...
El concepto es que el trabajo debe ser localizado en un método y los otros métodos usan este método para hacer el trabajo real y luego agregarle un giro único.
Si desea aprender algo oscuro sobre C++, intente las plantillas en profundidad y lea Modern C++ Design por Andrei Alexandrescu. Este libro es clásico sobre la metaprogramación de plantillas.
ADL (alias Koenig Lookup) es bastante oscuro, a pesar de que la gente lo usa sin darse cuenta en cada programa Hello World.
El truco "ScopeGuard", donde las referencias const como valores de retorno de las funciones están vinculadas al alcance de algo a lo que están asignadas, también es bastante oscuro. Sin embargo, ese artículo lo concientizó un poco.
También hay algunas propiedades y usos de sizeof() que cuentan como desconocidos, especialmente cuando se usan en macros o metaprogramas de plantillas.
+1 No tenía conocimiento del Mecanismo ADL. – SingleNegationElimination
muy oscura:
- operador void,();
- precedencia del operador ||() y el operador & &() cuando circuiting
expresiones lógicas corta - lo que sucede cuando se sobrecarga operador &()
- orden de inicialización de stateful inhertiance virtual.
- punteros deferencing a la plantilla miembros
- función de tratar bloques
- el asignador :: volver a enlazar la sintaxis
- comportamiento no por defecto de std :: inesperada
- std :: cout.imbue()
- Cualquier cosa con lugares, especialmente a medida facetas
- primordial a través de la dominación
- trigrafos
sólo para nombrar unos pocos
Nadie mencionó lo que creo que una de las partes más extrañas de C++, obviamente, después de pensamiento, la sintaxis para los operadores de decremento previo y pre-incremento.
class A {
public:
A &operator++() {...} // Post increment
A &operator--() {...} // Post decrement
};
vs.
class A {
public:
A &operator++(int) {...} // Pre increment
A &operator--(int) {...} // Pre decrement
};
Por supuesto, después de la subasta significa añadir una, sino devolver el valor anterior y el incremento de pre significa agregue y regresar el nuevo valor. Por ejemplo:
A a;
f(a++); // Post increment a
f(++a); // Pre increment a
No estoy seguro de qué ocurre si intenta utilizar o pasar el argumento 'int'. Se podría tratar de pasar de esta manera:
obj.operator++(0);
supongo que es la forma de diferenciar entre los dos operadores cuando se llama explícitamente.
Algunos ++ características obscuro C:
- literales analógicas http://web.archive.org/web/20120110153227/http://weegen.home.xs4all.nl/eelis/analogliterals.xhtml
- /espacios de nombres sin nombre anónimos http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8a.doc%2Flanguage%2Fref%2Funnamed_namespaces.htm
- funciones de conversión de los valores vuelvan a vacíohttps://stackoverflow.com/a/689716/2028887
- cambiar los argumentos por defecto la función http://cpptruths.blogspot.fi/2005/07/changing-c-function-default-arguments.html
- co calificadores NST http://publib.boulder.ibm.com/infocenter/iadthelp/v7r1/index.jsp?topic=/com.ibm.etools.iseries.langref.doc/as400clr57.htm
- inicialización directa (de tipos primitivos) https://stackoverflow.com/a/1029069/2028887
- explícita función -palabra clave http://www.glenmccl.com/tip_023.htm
- tratar bloques http://www.drdobbs.com/introduction-to-function-try-blocks/184401297
- clases locales https://stackoverflow.com/a/3100801/2028887
- principal función no requiere instrucción de retorno https://stackoverflow.com/a/1771776/2028887
- mut capaces -palabra clave Does the 'mutable' keyword have any purpose other than allowing the variable to be modified by a const function?
- operadores ++ y sobrecarga - https://stackoverflow.com/a/3846374/2028887
- colocación nuevoshttp://www.parashift.com/c++-faq/placement-new.html
- puros implementaciones función virtual https://stackoverflow.com/a/2089176/2028887
- calificadores árbitro http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2819.html
- referencias a los valores temporales http://bytes.com/topic/c/answers/169672-const-reference-temporary-object-why
- registro -keyword http://en.cppreference.com/w/cpp/keyword/register
- que regresan valores nulos https://stackoverflow.com/a/2176229/2028887 argumento
- plantilla como un amigo Template parameter as a friend
- argumentos de plantilla plantilla de http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Ftemplate_template_arguments.htm
- funciones variadic http://en.cppreference.com/w/cpp/utility/variadic
- macros variadic http://en.wikipedia.org/wiki/Variadic_macro
- herencia virtual https://stackoverflow.com/a/21607/2028887
- volátil -keywor d http://en.cppreference.com/w/cpp/keyword/volatile
- 1. ¿Cuáles son algunas de las bibliotecas de cifrado/hash más utilizadas en C?
- 2. ¿Cuáles son algunas alternativas más rápidas a Java2d?
- 3. ¿Cuáles son algunas situaciones en las que Agile es inapropiado?
- 4. ¿Cuáles son algunas características útiles de TextMate?
- 5. ¿Cuáles son algunas de las alternativas del pagerank?
- 6. ¿Cuáles son algunas de las características más útiles aunque poco conocidas en el lenguaje PowerShell
- 7. ¿Cuáles son las características más abusadas en Visual Studio/C#?
- 8. ¿Cuáles son algunas de las expresiones regulares más útiles para los programadores?
- 9. C++: ¿cuáles son las vulnerabilidades más comunes y cómo evitarlas?
- 10. ¿Cuáles son algunas de las mejores prácticas de uso de la Biblioteca estándar de C++?
- 11. ¿Cuáles son las partes más importantes del framework .NET para un principiante?
- 12. ¿Cuáles son algunas técnicas para limitar las dependencias de compilación en proyectos de C++?
- 13. ¿Cuáles son algunas buenas soluciones de ORM de Python?
- 14. ¿Cuáles son algunas aplicaciones destacadas del mundo real de Java?
- 15. ¿Cuáles son las bibliotecas comunes para C?
- 16. ¿Cuáles son las mejores características/más estables de la biblioteca de cierre de Google
- 17. ¿Cuáles son las ventajas de usar Objective-C sobre C++
- 18. Cuáles son algunas aplicaciones prácticas de XOR en los algoritmos
- 19. Cuáles son las ventajas de C# sobre Python
- 20. ¿Cuáles son algunas de las razones por las cuales un único desarrollador debe usar TDD?
- 21. ¿Cuáles son algunas metodologías de programación para desarrolladores en solitario?
- 22. ¿Cuáles son algunas aplicaciones de importancia económica del aprendizaje automático?
- 23. ¿Cuáles son algunas estrategias populares de diseño de Git?
- 24. ¿Cuáles son las alternativas más elegantes a las interfaces constantes?
- 25. ¿Cuáles son las aplicaciones del algoritmo de ruta más corta?
- 26. ¿Cuáles son las características propuestas más útiles de C1X?
- 27. ¿Cuáles son algunas de las mejores prácticas de administración de memoria de Java?
- 28. ¿Cuáles son algunas buenas maneras de hacer el bloqueo intermachine?
- 29. ¿Cuáles son algunas herramientas de cobertura de código para Perl?
- 30. ¿Cuáles son las cosas buenas de baba?
Los libros de Herb Sutter son realmente excelentes, pero no clasificaría los temas que tratan como "oscuros", son cosas que todos los programadores de C++ deberían tener en cuenta. –
Una respuesta que requiere que compre un libro es una mala para Stack Overflow en mi opinión. – jcoffland