C ++ principios básicos C.60: copias operador de asignación const y deben basarse en los parámetros, el tipo de retorno de la función virtual de referencia no const

C.60: Copiar el maquillaje no Asignación virtual, por const y sacar el parámetro, y el retorno por no constante y
C.60: copias operador de asignación const y deben basarse en los parámetros, el tipo de devolución de función virtual de referencia no const

 

 

La razón (razón)

 

 

Es simple y eficiente. Si desea optimizar para rvalues, proporcionar una sobrecarga que lleva a && (ver F.18).

Debido a esta sencilla y eficiente. Si desea optimizar el valor de la derecha para proporcionar una && (referencias rvalue) sobrecarga de uso.

 

Ejemplo (Ejemplo)

 

 

 

class Foo {
public:
    Foo& operator=(const Foo& x)
    {
        // GOOD: no need to check for self-assignment (other than performance)
        auto tmp = x;
        swap(tmp); // see C.83
        return *this;
    }
    // ...
};

Foo a;
Foo b;
Foo f();

a = b;    // assign lvalue: copy
a = f();  // assign rvalue: potentially move

 

 

Nota (Nota)

 

 

La técnica de aplicación de intercambio ofrece la garantía fuerte.

Se proporciona la función de intercambio de tecnología (consulte C.83) (copia no se produce ya que, nota del traductor) fuerte garantía.

 

Ejemplo (Ejemplo)

 

 

Pero lo que si usted puede conseguir un rendimiento significativamente mejor al no hacer una copia temporal? Considere un vector simple destinado a un dominio en el que la asignación de los vectores grandes, de igual tamaño es común. En este caso, la copia de elementos implícitos en la técnica de aplicación de intercambio podría causar un orden de magnitud aumento en el costo:

Pero no se puede pasar al menos una vez una copia temporal de la acción a ser significativamente mayor rendimiento? Considerado por (elementos, nota del traductor) escena simple del mismo tamaño del vector enorme tarea. En este caso, los elementos técnicos realizados por la operación de intercambio de copiar provocarán un aumento sustancial del coste.

 

Nota del traductor

El ejemplo anterior, un constructor de copia realiza antes de intercambio

 

template<typename T>
class Vector {
public:
    Vector& operator=(const Vector&);
    // ...
private:
    T* elem;
    int sz;
};

Vector& Vector::operator=(const Vector& a)
{
    if (a.sz > sz) {
        // ... use the swap technique, it can't be bettered ...
        return *this;
    }
    // ... copy sz elements from *a.elem to elem ...
    if (a.sz < sz) {
        // ... destroy the surplus elements in *this and adjust size ...
    }
    return *this;

Al escribir directamente a los elementos de destino, obtendremos la garantía básica en lugar de la fuerte garantía que ofrece la técnica de intercambio. Cuidado de la auto-asignación.

Los datos se escriben directamente por el elemento de objeto, podemos conseguir la seguridad básica, no es fuerte garantía proporcionada por la tecnología de intercambio. Con el fin de evitar que nosotros mismos asignación.

 

Alternativas (opcional)

 

 

Si usted cree que necesita un operador de asignación virtual, y entender por qué eso es muy problemática, no lo llame = operador. Que sea una función denominada como virtuales asignar vacío (const Foo Y). Ver clon constructor de copia vs ().

Si usted cree que necesita un operador de asignación virtual, y producirá una profunda comprensión del problema, no diseñado como un operador de asignación. Se define como una función llamada, asigne void por ejemplo virtual (const Foo & amp;). [Referencia] Cloning vs constructor de copia.

 

La clonación de un constructor de copia vs enlace:

https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#Rc-copy-virtual

 

Cumplimiento (Sugerencias)

 

 

  • (Simple) Un operador de asignación no debe ser virtual. ¡Aquí hay dragones!

    operador (simple) de asignación no debe ser virtual. Hacer muy peligroso.

  • (Simple) Un operador de asignación debe devolver T & para permitir el encadenamiento, no alternativas como const T y que interfieren con la del composability y poner objetos en contenedores.

    (Simple) operador de asignación debe volver a T &, a fin de lograr la asignación continua. No cambie el tipo const T & Del mismo modo, va a afectar e interferir con el conjunto de los objetos en el contenedor.

  • (Moderado) un operador de asignación debe (implícita o explícitamente) invoke todos los operadores de asignación de base y miembros. Mira el destructor para determinar si el tipo tiene una semántica puntero o la semántica de valor.

    (Promedio) operador de asignación debe (implícita o explícitamente) llama a la clase base y todos los miembros del operador de asignación. Se observó Destructor para determinar el tipo de la semántica puntero de fórmula o el valor semántica.

Descripción del enlace

 

 

https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#c60-make-copy-assignment-non-virtual-take-the-parameter-by-const-and-return-by-non- const

 


 

Creo que este artículo útil? pulgares de bienvenida ya compartir con más personas.

Leer artículos más actualizados, por favor preste atención a las micro-canal número público de pensamiento orientado a objetos []

Publicados 408 artículos originales · ganado elogios 653 · vistas 290 000 +

Supongo que te gusta

Origin blog.csdn.net/craftsman1970/article/details/104637832
Recomendado
Clasificación