Preguntas frecuentes de la entrevista de C++ | Serie 1

 

¿Cuáles son las diferencias entre C y C++?  
1) C++ es una especie de superconjunto de C, la mayoría de los programas de C, excepto algunas excepciones (consulte this y this ), también funcionan en C++. 
2) C es un lenguaje de programación procedimental, pero C++ admite tanto la programación procedimental como la orientada a objetos. 
3) Dado que C++ admite la programación orientada a objetos, admite funciones como sobrecarga de funciones, plantillas, herencia, funciones virtuales, funciones amigas. Estas características están ausentes en C. 
4) C++ admite el manejo de excepciones a nivel de lenguaje, en C el manejo de excepciones se realiza en el estilo tradicional de if-else. 
5) C++ admite referencias , C no. 
6) En C, scanf() y printf() se utilizan principalmente como entrada/salida. C++ utiliza principalmente flujos para realizar operaciones de entrada y salida. cin es un flujo de entrada estándar y cout es un flujo de salida estándar.

Hay muchas más diferencias, arriba hay una lista de las principales diferencias. 

 

¿Cuáles son las diferencias entre referencias y punteros?  
Tanto las referencias como los punteros se pueden usar para cambiar las variables locales de una función dentro de otra función. Ambos también se pueden usar para guardar la copia de objetos grandes cuando se pasan como argumentos a funciones o se devuelven de funciones, para obtener una ganancia de eficiencia. 
A pesar de las similitudes anteriores, existen las siguientes diferencias entre referencias y punteros.

Las referencias son menos poderosas que los punteros 
1) Una vez que se crea una referencia, no se puede hacer que luego haga referencia a otro objeto; no se puede volver a colocar. Esto se hace a menudo con punteros. 
2) Las referencias no pueden ser NULL. Los punteros a menudo se hacen NULL para indicar que no apuntan a nada válido. 
3) Una referencia debe inicializarse cuando se declara. No existe tal restricción con punteros.

Debido a las limitaciones anteriores, las referencias en C++ no se pueden usar para implementar estructuras de datos como Lista enlazada, Árbol, etc. En Java, las referencias no tienen las restricciones anteriores y se pueden usar para implementar todas las estructuras de datos. El hecho de que las referencias sean más poderosas en Java es la razón principal por la que Java no necesita punteros.
Las referencias son más seguras y fáciles de usar: 
1) Más seguras: dado que las referencias deben inicializarse, es poco probable que existan referencias salvajes como punteros salvajes. Todavía es posible tener referencias que no se refieran a una ubicación válida (Ver preguntas 5 y 6 en el siguiente ejercicio) 
2) Más fácil de usar: las referencias no necesitan un operador de desreferenciación para acceder al valor. Se pueden utilizar como variables normales. El operador ‘&’ solo se necesita en el momento de la declaración. Además, se puede acceder a los miembros de una referencia de objeto con el operador de punto (‘.’), a diferencia de los punteros donde se necesita el operador de flecha (->) para acceder a los miembros.

¿Qué son las funciones virtuales? ¿Escribe un ejemplo? 
Las funciones virtuales se utilizan con herencia, se llaman según el tipo de objeto apuntado o referido, no según el tipo de puntero o referencia. En otras palabras, las funciones virtuales se resuelven tarde, en tiempo de ejecución. La palabra clave virtual se utiliza para hacer que una función sea virtual.

Las siguientes cosas son necesarias para escribir un programa C++ con polimorfismo en tiempo de ejecución (uso de funciones virtuales) 
1) Una clase base y una clase derivada. 
2) Una función con el mismo nombre en una clase base y una clase derivada. 
3) Un puntero o referencia de tipo de clase base que apunta o hace referencia a un objeto de una clase derivada.

Por ejemplo, en el siguiente programa, bp es un puntero de tipo Base, pero una llamada a bp->show() llama a la función show() de la clase Derivada, porque bp apunta a un objeto de la clase Derivada.

C++

#include<iostream>
using namespace std;
 
class Base {
public:
    virtual void show() { cout<<" In Base \n"; }
};
 
class Derived: public Base {
public:
    void show() { cout<<"In Derived \n"; }
};
 
int main(void) {  
    Base *bp = new Derived;    
    bp->show();  // RUN-TIME POLYMORPHISM
    return 0;
}

Producción: 

In Derived

¿Qué es este puntero?  
El puntero ‘this’ se pasa como un argumento oculto a todas las llamadas a funciones miembro no estáticas y está disponible como una variable local dentro del cuerpo de todas las funciones no estáticas. El puntero ‘este’ es un puntero constante que contiene la dirección de memoria del objeto actual. El puntero ‘este’ no está disponible en las funciones de miembros estáticos, ya que las funciones de miembros estáticos se pueden llamar sin ningún objeto (con el nombre de la clase).

¿Podemos hacer «eliminar esto»?  
Consulte https://www.geeksforgeeks.org/delete-this-in-c/

¿Qué son VTABLE y VPTR?  
vtable es una tabla de punteros de función. Se mantiene por clase. 
vptr es un puntero a vtable. Se mantiene por objeto (Vea esto para un ejemplo). 
El compilador agrega código adicional en dos lugares para mantener y usar vtable y vptr. 
1) Código en cada constructor. Este código establece vptr del objeto que se está creando. Este código establece que vptr apunte a vtable de la clase. 
2) Código con llamada de función polimórfica (por ejemplo, bp->show() en el código anterior). Siempre que se realiza una llamada polimórfica, el compilador inserta código para buscar primero vptr usando un puntero o referencia de clase base (en el ejemplo anterior, dado que el objeto apuntado o referido es del tipo derivado, se accede a vptr de una clase derivada). Una vez que se obtiene vptr, se puede acceder a vtable de la clase derivada. Usando vtable, se accede y se llama a la dirección de la función de clase derivada show().

También te puede interesar:  

Pronto cubriremos más C++. Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *