2009-05-23 16 views

Respuesta

2

Los libros de Herb Sutter son una fuente excelente para este tema: comience con http://www.gotw.ca/publications/xc++.htm.

+3

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. –

+4

Una respuesta que requiere que compre un libro es una mala para Stack Overflow en mi opinión. – jcoffland

5

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.

4

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í.

+0

¿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. –

+2

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

+0

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

1

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 .

1

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 ...
+1

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. –

0

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.

9

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

+1 No tenía conocimiento del Mecanismo ADL. – SingleNegationElimination

2

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

1

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.

2

Algunos ++ características obscuro C:

Cuestiones relacionadas