[Notas de C ++] Estructura de C ++ y orden de ejecución del destructor

No hace mucho, un amigo se reunió con un puesto de desarrollo back-end reclutado por Tencent y habló con él. Dijo que el lado de Tencent es aún más básico. Hay más preguntas sobre C ++, sistemas operativos, redes y algoritmos, incluso si se trata de reclutamiento social. . Entre ellos, hay una pregunta sobre el orden de construcción y destrucción de C ++ cuando se trata de herencia virtual. No le presto mucha atención en los momentos normales, por lo que realmente avergonzó a muchos entrevistadores. Mi amigo es uno de ellos, por lo que es necesario resumirlo. .

En C ++, cuando se crea un objeto de clase, el compilador llamará automáticamente a algo llamado constructor. Sabemos que las clases y clases de C ++ están relacionadas en muchos casos, como herencia, composición, etc. Este tema se describe en el artículo Comprensión de los diagramas de clases UML (por favor, púlseme). Este artículo resume principalmente la secuencia de construcción y destrucción en diversas situaciones a través de ejemplos.

heredar

Escenario: La clase B hereda dos clases padre A y C. El constructor y destructor de cada clase son muy simples, que consiste en imprimir el nombre de la función correspondiente para observar el orden de ejecución de la construcción y el destructor.

#include <iostream>

using namespace std;

class A
{    
    public:        
        A(){cout << "A()" << endl;}       
        ~A(){cout << "~A()" << endl;}
};

class C
{    
    public:        
        C(){cout << "C()" << endl;}        
        ~C(){cout << "~C()" << endl;}
};

class B: public A, public C
{    
    public:        
        B(){cout << "B()" << endl;}        
        ~B(){cout << "~B()" << endl;}
};

int main(int argc, char const *argv[])
{    
    B b;    
    return 0;
}
bogon:dataStructure lizhong$ ./t
A()
C()
B()
~B()
~C()
~A()

Se puede ver en los resultados de ejecución: al crear un objeto de subclase, primero ejecute el constructor de la clase principal y luego ejecute su propio constructor. Si la subclase hereda varias clases principales, la clase principal se llamará de izquierda a derecha en el orden de herencia. Constructor (en este ejemplo, primero construya A, luego construya C), el orden de destrucción es opuesto al orden de construcción.

También sabemos que hay otro tipo de herencia llamada herencia virtual, echemos un vistazo al orden de construcción y destrucción en este caso.

#include <iostream>

using namespace std;

class A
{    
    public:        
        A(){cout << "A()" << endl;}       
        ~A(){cout << "~A()" << endl;}
};

class C
{    
    public:        
        C(){cout << "C()" << endl;}        
        ~C(){cout << "~C()" << endl;}
};

class B: public A, public C
{    
    public:        
        B(){cout << "B()" << endl;}        
        ~B(){cout << "~B()" << endl;}
};

int main(int argc, char const *argv[])
{    
    B b;    
    return 0;
}
bogon:dataStructure lizhong$ ./t
C()
A()
B()
~B()
~A()
~C()

Se puede ver que el orden de la herencia virtual y la construcción y destrucción de la herencia general es todavía un poco diferente. El orden de construcción de la clase padre ha cambiado. El constructor C de la herencia virtual se ejecuta primero y luego A. Finalmente, se llama a su propio constructor, y el orden de destrucción es opuesto al orden de construcción.

Los miembros incluyen otros miembros de objetos de clase

Escenario: La clase B contiene miembros de objetos de clase A y objetos de clase C, y en la clase B, el orden de declaración de sus miembros es declarar primero c, luego a. Eche un vistazo al orden de ejecución del constructor y el destructor al crear un objeto de clase B.

#include <iostream>

using namespace std;

class A
{    
    public:        
        A(){cout << "A()" << endl;}       
        ~A(){cout << "~A()" << endl;}
};

class C
{    
    public:        
        C(){cout << "C()" << endl;}        
        ~C(){cout << "~C()" << endl;}
};

class B
{    
    public:        
        B():a(A()), c(C()) {cout << "B()" << endl;}        
        ~B(){cout << "~B()" << endl;}
        C c;  
        A a;
};

int main(int argc, char const *argv[])
{    
    B b;    
    return 0;
}
bogon:dataStructure lizhong$ ./t
C()
A()
B()
~B()
~A()
~C()

Los resultados de la operación se pueden ver: al crear un objeto de clase B b, primero ejecute el constructor de la clase a la que pertenece su objeto miembro y luego ejecute su propio constructor. Si hay varios miembros de objeto de clase, llame a la estructura de clase correspondiente en el orden de declaración Función (en este ejemplo, primero construya el objeto de tipo C c, luego construya el objeto de tipo A a), el orden de destrucción es opuesto al orden de construcción.

Tanto la herencia como los miembros de objetos de clase

Escenario: la clase B hereda dos clases principales A y C, y la clase B tiene un miembro de objeto de la clase X. Observe el orden de ejecución de las funciones de construcción y destrucción.

#include <iostream>
using namespace std;

class A
{
    public:
        A(){cout << "A()" << endl;}
        ~A(){cout << "~A()" << endl;}
};

class C
{
    public:
        C(){cout << "C()" << endl;}
        ~C(){cout << "~C()" << endl;}
};

class X
{
    public:
        X(){cout << "X()" << endl;}
        ~X(){cout << "~X()" << endl;}
};

class B: public A, public  C
{
    public:
        B(){cout << "B()" << endl;}
        ~B(){cout << "~B()" << endl;}
        X x;
};

int main(int argc, char const *argv[])
{
    B b;
    return 0;
}
bogon:dataStructure lizhong$ ./t
A()
C()
X()
B()
~B()
~X()
~C()
~A()

Se pueden ver los resultados de la operación: cuando se construye la clase, primero llamará al constructor de la clase padre de izquierda a derecha, luego llamará al constructor miembro del objeto de la clase y finalmente llamará a su propio constructor. El orden de destrucción es opuesto al orden de construcción.

Lectura recomendada:

Cuidadosamente organizado | Catálogo histórico de artículos de productos secos
[bienestar] Recopilé videos de cursos boutique en línea para compartir (parte 1)
[estructura de datos y algoritmo] fácil de entender recorrido de árbol binario
[estructura de datos y algoritmo] fácil de entender árbol de búsqueda binaria

Céntrese en compartir resumen de conocimientos de pila de tecnología de fondo del servidor

Bienvenido a prestar atención a la comunicación y al progreso común.

[Notas de C ++] Estructura de C ++ y orden de ejecución del destructor

Codificación

¡El productor de códigos tiene la manera correcta de proporcionarle artículos técnicos fáciles de entender para facilitar la tecnología!

Supongo que te gusta

Origin blog.51cto.com/15006953/2552126
Recomendado
Clasificación