Pregunta sobre si el compilador genera automáticamente cuando la función miembro de la clase no está definida en C++

Pregunta sobre si el compilador genera automáticamente cuando la función miembro de la clase no está definida en C++

La respuesta es obviamente no . Cuando la función miembro predeterminada en C++ no está definida, el compilador no la generará automáticamente (entorno de compilación VS2019), sino que juzgará de acuerdo con las necesidades de la situación real. se generará automáticamente, de lo contrario no se generará.

Tome el constructor como ejemplo. En el código, definimos una clase de fecha. No hay ningún constructor personalizado en la clase. A continuación, establecemos un punto de interrupción en la línea 16.
inserte la descripción de la imagen aquí

Comience la depuración, podemos ver que aunque el punto de interrupción se establece en la línea 16, no se detiene en la línea 16 y, finalmente, la función se detiene en la línea 17.
inserte la descripción de la imagen aquí
A continuación vamos al ensamblado de funciones para ver si se genera una llamada de función (es decir, para ver si el compilador define un constructor y lo llama).
inserte la descripción de la imagen aquí
El resultado es obvio, no hay llamada de función cuando generamos la fecha de d1 (es decir, no hay instrucción de llamada en el ensamblado), lo que significa que el compilador de la clase de fecha actual no genera automáticamente un constructor .

De hecho, la razón por la que esto sucede es relativamente simple, es decir, cuando el compilador no genera un constructor, la variable tendrá un valor aleatorio al definir la variable, como se muestra en la siguiente figura: Si el constructor predeterminado sin parámetros se
inserte la descripción de la imagen aquí
genera automáticamente ( porque si el compilador generará automáticamente el constructor predeterminado, definitivamente no tendrá parámetros), como se muestra en la siguiente figura: los
inserte la descripción de la imagen aquí
valores de las variables en la clase final son los mismos y todos son aleatorios valores, por lo que para mejorar la eficiencia de la compilación, el compilador no generará el constructor de todos modos. El resultado es el mismo, entonces ¿por qué debería generarlo?), el constructor predeterminado no se generará automáticamente.

Pero... ¿y si defino una variable de alguna otra clase dentro de la clase Date?

A continuación, mire la demostración de ejemplo:
definí una variable de clase de tiempo en Fecha (incluido un constructor personalizado en esta clase)

inserte la descripción de la imagen aquíinserte la descripción de la imagen aquí

En este momento, volvemos a establecer un punto de interrupción y comenzamos la depuración:
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
esta vez, el punto de interrupción se estableció en la línea 30 y finalmente se detuvo en la línea 30 después de la depuración, lo que significa que hay código ensamblador detrás de esta línea. lenguaje ensamblador de nuevo.El resultado se muestra en la figura:
inserte la descripción de la imagen aquí

Esta vez podemos ver que aparece una declaración de llamada en el punto de interrupción para llamar al constructor para completar la construcción de variables en la clase.
Es decir, cuando la clase A contiene objetos de la clase B, si la clase A no define explícitamente ningún constructor y la clase B muestra un constructor predeterminado, el compilador definitivamente generará un constructor predeterminado para la clase A. El propósito es llamar al constructor de la clase B con el objeto de la clase A que contiene la clase B para lograr una inicialización completa.

PD: Este es uno de los casos, solo por ejemplo.

Supongo que te gusta

Origin blog.csdn.net/SFDWU3QVG/article/details/124214711
Recomendado
Clasificación