Red de conocimiento del abogados - Bufete de abogados - c Preguntas y respuestas de la entrevista clásica

c Preguntas y respuestas de la entrevista clásica

1. ¿Cuál es la diferencia entre una clase C y una estructura en C?

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

2. El uso y función de los destructores y funciones virtuales

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

Una función virtual se refiere a una función descrita por la palabra clave virtual, que utiliza las características polimórficas del lenguaje C.

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

1) La función de variables globales usa este bloque de programa, mientras que las variables locales afectan la función actual

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

 3) El ciclo de vida es diferente: las variables globales se crean y crean con el programa principal y se destruyen. cuando se destruye el programa principal, las variables locales están dentro de las funciones locales, e incluso los bucles locales existen internamente en el cuerpo, etc., pero no existen al salir

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. Se requiere el algoritmo del programa: la complejidad del tiempo es O (n) y la complejidad del espacio es O (1).

void sort(int e[], int n)

{

int i

int

;

 for (i=1; i {

 t = e[e[i]];

 e[e[i]] = e[i];

p>

e[i] = t

}

}

5. Distinguir entre montón y pila

A. Diferentes métodos de aplicación

El sistema asigna automáticamente la pila, mientras que el propio programador debe aplicar la pila y especificar el tamaño

B. El del sistema. la respuesta después de la aplicación es diferente

Pila: siempre que el espacio restante de la pila sea mayor que el espacio solicitado, 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 la aplicación del programa, primero recorre los registros en el sistema operativo. La lista vinculada de direcciones de memoria libre busca el primer nodo del montón que sea mayor que el espacio solicitado y luego elimina el nodo. de la lista vinculada de nodos espaciales y asigna el espacio del nodo al programa. Además, la mayoría de los sistemas también registrarán el tamaño de esta asignación en la primera dirección de este espacio de memoria para que la declaración de eliminación pueda liberarlo correctamente. Además, dado que el tamaño del nodo del montón encontrado no es necesariamente exactamente igual al tamaño solicitado, el sistema eliminará automáticamente el exceso y lo devolverá parcialmente a la lista enlazada libre.

C. Diferencias en la aplicación. límites de tamaño

Pila: en Windows, el tamaño de la pila es 2 M (también puede ser 1 M, que se determina en el momento de la compilación (constante determinada), si el espacio solicitado excede el espacio restante de la pila). , se provocará un desbordamiento. Por lo tanto, el espacio disponible en la pila es menor.

Montón: el montón es una estructura de datos que se extiende a direcciones altas. Esto se debe a que el sistema. utiliza una lista vinculada para almacenar direcciones de memoria libre, que son naturalmente discontinuas, y la dirección transversal de la lista vinculada es de dirección baja a dirección alta. El tamaño del montón está limitado en la memoria virtual efectiva. Se ve que el espacio obtenido por el montón es más flexible y mayor.

D. Comparación de la eficiencia de la aplicación:

El sistema asigna automáticamente la pila y es más rápida. Pero el programador no tiene control.

El montón es memoria asignada por nuevos. Generalmente es lento y propenso a la fragmentación de la memoria, pero es el más conveniente de usar.

Además, en WINDOWS, la mejor manera es usar VirtualAlloc para asignar memoria. No está en el montón o en la pila. Reserva directamente una memoria en el espacio de direcciones del proceso. menos conveniente de usar. Pero es rápido y más flexible.

E. Contenido de almacenamiento en el montón y la pila

Pila: cuando se llama a una función, la primera instrucción enviada a la pila es la siguiente instrucción después de la función principal (la llamada a la función declaración) La dirección de la siguiente declaración ejecutable), y luego los parámetros de la función. En la mayoría de los compiladores de C, los parámetros se insertan en la pila de derecha a izquierda, y luego las variables locales en la función. Tenga en cuenta que las variables estáticas no se insertan en la pila. Cuando finaliza esta llamada de función, las variables locales se extraen de la pila primero, luego los parámetros y, finalmente, el puntero superior de la pila apunta a la dirección donde se almacenó originalmente, que es la siguiente instrucción en la función principal. continúa corriendo desde este punto.

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

Macros: Ventajas: Completadas en la etapa de preprocesamiento, no ocupan tiempo de compilación y, al mismo tiempo, eliminan el costo. de llamadas a funciones Alta eficiencia operativa

Desventajas: sin verificación de tipos, múltiples sustituciones de macros harán que el tamaño del código aumente y, dado que las macros son esencialmente sustituciones de cadenas, pueden ocurrir errores debido a los efectos secundarios de algunos parámetros. . resultado.

Función: Ventajas: No hay posibles efectos secundarios causados ​​por macros con parámetros, se realiza la verificación de tipos y la exactitud de los cálculos está más garantizada.

Desventajas: las llamadas a funciones requieren la sobrecarga de insertar y extraer parámetros, direcciones de retorno, etc., y no son tan eficientes como las macros con parámetros

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

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. Se expanden en el programa que llama a la función (se completa durante la compilación); macros;

La diferencia es que las funciones en línea pueden completar funciones de compilación, como la detección de tipos y si las declaraciones son correctas durante la compilación, las macros no tienen tales funciones, y el tiempo de expansión de las macros es diferente al de las funciones en línea; (Expandir durante el tiempo de ejecución)

7. ¿Dónde está el punto de entrada del programa de Windows? Escriba el proceso del mecanismo de mensajes de Windows

El punto de entrada del programa de Windows es WinMain. () función.

Mecanismo de procesamiento de mensajes de la aplicación 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 los mensajes uno por uno de la cola de mensajes. Después de recuperar los mensajes, la aplicación puede realizar algún preprocesamiento en los mensajes.

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

D. El sistema utiliza el puntero de la función de procedimiento de ventana guardada en el miembro lpfnWndProc de la estructura WNDCLASS para llamar al procedimiento de ventana para procesar el mensaje.

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

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

En resumen, la función miembro de una clase? La función de devolución de llamada es El destinatario de la llamada devuelve la función de 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 utiliza la dirección pasada para llamar a la función de devolución de llamada cuando sea necesario.

La función de devolución de llamada la escribe usted. 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, para que pueda completar lo que desea hacer en la función de devolución de llamada.

B. 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, debe hacer tres cosas:

a. Declaración;

b. Definición;

c. llamadas

Por ejemplo:

1. Declare el tipo de función de devolución de llamada

typedef void (*FunPtr)(void

2); Definir la función de devolución de llamada

 class A

 {

 public:

 A(); void callBackFun(void ) // La función de devolución de llamada debe declararse estática

{

coutlt;lt;"callBackFun"lt

}

<; p>virtual ~A();

};

3. Establecer condiciones de activación

void Funtype(FunPtr p)

{

p();

}

void main(void)

{

Funtype(A: :callBackFun)

}

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

Las devoluciones de llamada y las API están muy parecidas y su funcionalidad es que son multicapa. funciones de llamada. 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. La devolución de llamada es todo lo contrario. Layer Es desconocido para la capa inferior y debe ser instalado 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 inferior no conoce el nombre de la devolución de llamada. Función de devolución de llamada a través de un puntero de función. Cuando es necesario llamarla, solo necesita hacer referencia a este puntero de función y a los punteros de parámetros relacionados.

De hecho: la devolución de llamada es la función escrita en la capa de alto nivel. La capa de bajo nivel guarda esta función a través de un puntero de función. Cuando se activa un determinado evento, la capa de bajo nivel llama. función de alto nivel a través del puntero de función.

?