resueltos programas programacion poo ejercicios ejemplos ejemplo curso constructores codigo clases avanzados avanzada c++ copy-constructor assignment-operator

programas - Lista de comprobación para escribir el constructor de copias y el operador de asignación en C++



programacion avanzada c++ pdf (4)

No tengo idea acerca de la excepción de forma segura aquí, pero voy por aquí. Imaginemos que es una envoltura de matriz modelada. Espero eso ayude :)

Array(const Array& rhs) { mData = NULL; mSize = rhs.size(); *this = rhs; } Array& operator=(const Array& rhs) { if(this == &rhs) { return *this; } int len = rhs.size(); delete[] mData; mData = new T[len]; for(int i = 0; i < len; ++i) { mData[i] = rhs[i]; } mSize = len; return *this; }

Por favor, escriba una lista de tareas que un constructor de copias y un operador de asignación deben hacer en C ++ para mantener la seguridad de las excepciones, evitar fugas de memoria, etc.



Primero asegúrate de que realmente necesites apoyar la copia. La mayoría de las veces no es el caso, y por lo tanto deshabilitar ambos es el camino a seguir.

A veces, aún necesitará proporcionar duplicación en una clase de una jerarquía polimórfica, en ese caso: deshabilitar el operador de asignación, escribir un constructor de copia (¿protegido?) Y proporcionar una función de clonación virtual ().

De lo contrario, en el caso de que escriba una clase de valor, regresará a la tierra de la Forma canónica ortogonal de Coplien. Si tiene un miembro que no puede copiarse trivialmente, deberá proporcionar un constructor de copia, un destructor, un operador de asignación y un constructor predeterminado. Esta regla puede refinarse, ver por ejemplo: La ley de los dos grandes

También recomendaría echar un vistazo a las preguntas frecuentes de C ++ con respecto a los operadores de asignación , y al idioma de copiar y cambiar y en GOTW .


Las versiones generadas por el compilador funcionan en la mayoría de las situaciones.

Debe pensar un poco más sobre el problema cuando su objeto contiene un puntero RAW (un argumento para no tener punteros RAW). Entonces, si tiene un puntero RAW, la segunda pregunta es si posee el puntero (¿está siendo borrado por usted)? Si es así, deberá aplicar la regla de 4.

Poseer más de 1 puntero RAW se vuelve cada vez más difícil de hacer correctamente (El aumento en la complejidad tampoco es lineal [pero eso es observacional y no tengo estadísticas reales para respaldar esa afirmación]). Entonces, si tiene más de 1 puntero RAW, piense en envolver cada uno en su propia clase (alguna forma de puntero inteligente).

Regla de 4: si un objeto es el propietario de un puntero RAW, debe definir los siguientes 4 miembros para asegurarse de que maneja la gestión de la memoria correctamente:

  • Constructor
  • Copiar Constructor
  • Operador de Asignación
  • Incinerador de basuras

La forma en que los defina dependerá de las situaciones. Pero hay que tener cuidado:

  • Construcción predeterminada: establecer el puntero a NULL
  • Copiar constructor: utilice Copiar e intercambiar ideum para proporcionar a la "Fuerte garantía de excepción"
  • Operador de asignación: verificar la asignación a uno mismo
  • Destructor: protégete contra las excepciones que se propagan fuera del destructor.