C ++ principios básicos C.40: Si la clase contiene el mismo tipo, se define un constructor

C.40: Definir un constructor si una clase tiene un invariante

 

 

constructor si la clase contiene el invariante se define: C.40

 

 

La razón (razón)

Eso es lo que los constructores son para.

Este es el propósito de la existencia del constructor.

 

 

Ejemplo (Ejemplo)

class Date {  // a Date represents a valid date
              // in the January 1, 1900 to December 31, 2100 range
    Date(int dd, int mm, int yy)
        :d{dd}, m{mm}, y{yy}
    {
        if (!is_valid(d, m, y)) throw Bad_date{};  // enforce invariant
    }
    // ...
private:
    int d, m, y;
};

A menudo es una buena idea para expresar el invariante como un Asegura en el constructor.

En el constructor garantizan el cumplimiento por todos los idiomas es generalmente una buena idea.

 

 

Nota (Nota)

Un constructor puede ser usado por conveniencia, incluso si una clase no tiene un invariante. Por ejemplo:

Para mayor comodidad, a pesar de que la clase no contiene invariante puede ser definido por un constructor de la clase.

struct Rec {
    string s;
    int i {0};
    Rec(const string& ss) : s{ss} {}
    Rec(int ii) :i{ii} {}
};

Rec r1 {7};
Rec r2 {"Foo bar"};

 

 

Nota (Nota)

El C ++ 11 inicializador regla de lista elimina la necesidad de muchos constructores. Por ejemplo:

C ++ lista de inicialización 11 elimina la necesidad de muchos constructor. Por ejemplo:

struct Rec2{
    string s;
    int i;
    Rec2(const string& ss, int ii = 0) :s{ss}, i{ii} {}   // redundant
};

Rec2 r1 {"Foo", 7};
Rec2 r2 {"Bar"};

El constructor Rec2 es redundante. Además, el valor predeterminado para int sería mejor hacerlo como un inicializador miembro.

REC2 constructor es redundante. Mientras tanto, los valores predeterminados proporcionados por int miembro de inicialización harán mejor.

Ver también: constructo objeto y constructor válida lanza.

Ver también: [construir] y [constructor de objetos legal se produce una excepción]

 

 

Enlaces relacionados

 

Miembro de inicialización:

https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#Rc-in-class-initializer

La construcción del objeto legal:

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

Constructor lanza una excepción:

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

 

 

Cumplimiento (Sugerencias)

  • clases, marca con operaciones de copia definidos por el usuario, pero ningún constructor (una copia definida por el usuario es un buen indicador de que la clase tiene un invariante)

  • Si la clase contiene una operación definida por el usuario pero no proporciona un constructor de copia (la copia de la indicación clara definida por el usuario es invariante con la clase)

     

 

Descripción del enlace

 

https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#c40-define-a-constructor-if-a-class-has-an-invariant

 


 

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/104396974
Recomendado
Clasificación