La Red de Conocimientos Pedagógicos - Currículum vitae - Preguntas y respuestas de la entrevista C Classic

Preguntas y respuestas de la entrevista C Classic

¿Cuál es la diferencia entre las clases de 1. ¿C y estructuras en lenguaje C?

El permiso de acceso predeterminado de los miembros de la estructura es público, mientras que el permiso de acceso de los miembros de la clase es privado.

2. Uso y funciones de los destructores y funciones virtuales

El destructor es una función que se llama automáticamente al final del ciclo de vida del objeto para liberar la asignación de memoria en el constructor. .

Función virtual se refiere a la función descrita por la palabra clave Virtual. Su función es aprovechar las características polimórficas del lenguaje C.

3. ¿Cuál es la diferencia entre variables globales y variables locales? ¿Cómo se logra? ¿Cómo saben esto el sistema operativo y el compilador?

1) Las variables globales se utilizan en este bloque de programa, mientras que las variables locales se utilizan en la función actual.

2) El primero se asigna en el área de datos globales de la memoria y el segundo se asigna en el área de la pila.

3) Diferentes ciclos de vida: las variables globales se crean y destruyen con la creación del programa principal, y se destruyen con la destrucción del programa principal. Las variables locales existen dentro de funciones locales e incluso existen dentro del bucle local; cuerpos, pero la salida no existe.

4) Diferentes métodos de uso: después de la declaración, las variables globales se pueden usar en todas las partes del programa, mientras que las variables locales solo se pueden usar localmente.

4. Hay n números naturales (1?n) de diferentes tamaños. Ordénelos de pequeño a grande. Requiere un algoritmo procesal: la complejidad temporal es O(n), la complejidad espacial es O(1).

void sort(int e[], int n)

{

int I;

int t;

for(I = 1;i{

t = e[e[I]];

e[e[I]]= e[I]; p>

e[I]= t;

}

}

5 La diferencia entre montón y pila

A.Diferentes métodos de aplicación

El sistema asigna automáticamente la pila, mientras que el montón requiere que el programador solicite y especifique el tamaño

B. application.p>

Pila: siempre que el espacio restante de la pila sea mayor que el espacio de la aplicación, el sistema proporcionará memoria para el programa; de lo contrario, se generará una excepción de desbordamiento de la pila.

Montón: cuando el sistema recibe una aplicación de programa, primero recorra la lista vinculada de direcciones de memoria libre en el sistema operativo, busque el primer nodo del montón que sea más grande que el espacio de la aplicación, luego elimine el nodo de la lista vinculada de nodos espaciales. Asigne el espacio de este nodo al programa. Además, la mayoría de los sistemas también utilizarán esta memoria. La primera dirección del espacio registra el tamaño asignado para que la declaración de eliminación pueda liberar el espacio correctamente. El nodo encontrado no es necesariamente exactamente igual al tamaño de la aplicación, el sistema automáticamente colocará la parte sobrante en la lista libre

Diferentes límites de tamaño de la aplicación

Pila: En Windows, el tamaño de la pila es 2 M (o 1 M, si se solicita en el momento de la compilación). Si el espacio excede el espacio restante de la pila, se generará un desbordamiento. Por lo tanto, se puede obtener menos espacio de la pila. >

Montón: el montón es una estructura de datos que se extiende a direcciones altas y es un área de memoria discontinua. Esto se debe a que el sistema utiliza una lista vinculada para almacenar direcciones de memoria libres, que naturalmente son discontinuas. desde la dirección baja hasta la dirección alta, el tamaño del montón está limitado por la memoria virtual disponible en el sistema informático y el espacio es más flexible y grande.

D. p>

El sistema asigna automáticamente la pila, pero el programador no puede controlarla. p>El montón es memoria asignada por nueva. Generalmente es lenta y propensa a la fragmentación de la memoria, pero es la más conveniente de usar.

Además, en WINDOWS, la mejor manera es usar VirtualAlloc para asignar memoria, no en el montón o la pila, sino directamente en el espacio de direcciones del proceso, aunque es el más inconveniente de usar. Pero es rápido y más flexible.

E. Almacenamiento en el montón y en la pila

Pila: Cuando se llama a una función, lo primero que se apila es la dirección de la siguiente instrucción en la función principal (la dirección). debajo de la declaración de llamada de función) una declaración ejecutable), seguida de los argumentos de la función. En la mayoría de los compiladores de C, los argumentos se apilan de derecha a izquierda, seguidos de las variables locales dentro de la función. Tenga en cuenta que las variables estáticas no están apiladas. Cuando se completa esta llamada a la función, primero se muestran las variables locales, luego los parámetros y, finalmente, el puntero en la parte superior de la pila apunta a la dirección más abierta, que es la siguiente instrucción en la función principal, y el programa continúa. huye de aquí.

Montón: Generalmente en el montón. El encabezado usa un byte para almacenar el tamaño del montón. El contenido específico del montón lo organiza el programador.

6. Ventajas y desventajas de las macros y funciones con parámetros

Macro: Ventajas: Completado en la etapa de preprocesamiento, no ocupa tiempo de compilación, ahorra el costo de las llamadas a funciones y alta eficiencia operativa.

Desventajas: no hay verificación de tipos, múltiples sustituciones de macros generarán un tamaño de código mayor y, dado que las macros son esencialmente sustituciones de cadenas, se pueden obtener resultados incorrectos debido a los efectos secundarios de ciertos parámetros.

Función: Ventajas: No hay posibles efectos secundarios causados ​​por macros con parámetros, y la exactitud de los cálculos se puede garantizar mediante la verificación de tipos.

Desventajas: las llamadas a funciones requieren la sobrecarga de insertar y extraer parámetros y direcciones de retorno, y la eficiencia no es tan alta como con los parámetros.

PD: La diferencia entre macros y funciones en línea

Tanto las funciones en línea como las macros se expanden donde aparece el programa. Las funciones en línea no se implementan mediante llamadas a funciones, sino que se expanden en el programa que llama a la función (lo que se realiza en tiempo de compilación). Macros también;

La diferencia es que las funciones en línea pueden completar funciones de compilación, como la detección de tipos y la corrección de declaraciones en el momento de la compilación, las macros no tienen dicha función, y el tiempo de expansión de las macros también es diferente de; el de las funciones en línea (extensión Runtime)

7. ¿Dónde está el punto de entrada del programa de Windows? El proceso de escritura del mecanismo de mensajería de Windows.

La entrada al programa de Windows es la función WinMain().

Mecanismo de procesamiento de mensajes de aplicaciones de Windows:

a. El sistema operativo recibe el mensaje de la ventana de la aplicación y lo entrega a la cola de mensajes de la aplicación.

B. La aplicación llama a la función GetMessage en el bucle de mensajes para recuperar mensajes uno tras otro de la cola de mensajes. Después de recuperar el mensaje, la aplicación puede realizar algún preprocesamiento del mensaje.

C. La aplicación llama a DispatchMessage para enviar el mensaje al sistema operativo.

d El sistema procesa el mensaje llamando al procedimiento de ventana utilizando un puntero a la función del procedimiento de ventana guardada en el miembro lpfnWndProc de la estructura WNDCLASS.

8. ¿Cómo definir e implementar una función miembro de una clase como función de devolución de llamada?

A. ¿Qué es una función de devolución de llamada?

En resumen, una función de devolución de llamada es una función que el destinatario devuelve la llamada a la persona que llama.

Usar una función de devolución de llamada en realidad significa pasar la dirección de una de sus propias funciones (esta función es una función de devolución de llamada) como parámetro a la función llamada cuando se llama a una función (generalmente una función API). La función llamada llama a la función de devolución de llamada si es necesario utilizando la dirección pasada.

La función de devolución de llamada la escribí yo mismo. Necesita llamar a otra función y uno de los parámetros de esta función es el nombre de su función de devolución de llamada. De esta manera, el sistema llamará a la función de devolución de llamada que usted escribió cuando sea necesario, permitiéndole hacer lo que desee en la función de devolución de llamada.

Cómo definir e implementar la función miembro de una clase como una función de devolución de llamada

Para definir e implementar la función miembro de una clase como una función de devolución de llamada, necesitas hacer tres cosas:

A. Declaración;

B. Definición;

C. Establecer las condiciones de activación significa tomar el nombre de la función de devolución de llamada como parámetro en la función. llámalo.

Por ejemplo:

Primero, declare el tipo de función de devolución de llamada

typedef void(* FunPtr)(void);

En segundo lugar, definir la función de devolución de llamada

Nivel A

{

Público:

a();

Vacío estático callBackFun(void) // La función de devolución de llamada debe declararse como estática.

{

cout lt lt" callBackFun " lt

}

Virtual~ A();

};

En tercer lugar, establezca las condiciones de activación

Tipo de función no válido (parámetro de función)

{

p();

p>

}

Administrador no válido(no válido)

{

funtype(A::callback fun);

}

Funciones de devolución de llamada C. y funciones API

Las devoluciones de llamada están muy cerca de las API y su * * * esencia es una función de llamada entre capas. Pero la diferencia es que la API es una llamada proporcionada por la capa inferior a la capa superior. Generalmente, esta función es conocida por la capa superior y las devoluciones de llamada son todo lo contrario. Es una llamada proporcionada por la capa superior a la capa inferior. La capa inferior no lo sabe y debe ser instalada por la capa superior. Esta función de instalación es en realidad una API proporcionada por la capa inferior. Después de la instalación, la capa subyacente no conoce el nombre de esta devolución de llamada, pero guarda la función de devolución de llamada a través de un puntero de función. Cuando necesite llamar, solo necesita hacer referencia a este puntero de función y los punteros de parámetros relacionados.

De hecho, la devolución de llamada es una función escrita en el nivel alto, y el nivel bajo guarda la función a través de un puntero de función. Cuando se activa el evento, la capa inferior llama a la función en la capa superior a través del puntero de función.

?