¡Descubre Cómo los Constructores y Punteros en C++ Transforman Tu Código!post-template-default single single-post postid-46 single-format-standard et_pb_button_helper_class et_fixed_nav et_show_nav et_secondary_nav_enabled et_primary_nav_dropdown_animation_fade et_secondary_nav_dropdown_animation_fade et_header_style_left et_pb_footer_columns4 et_cover_background et_pb_gutter et_pb_gutters3 et_right_sidebar et_divi_theme et-db
771 715 4434

Muchas otras cuestiones relacionadas con las clases, es importante pensar en ellas como tipos de objetos. Definidos por el usuario, pero que en lo demás no se distinguen gran cosa de otros tipos preconstruidos en el lenguaje. La estructura que contiene los miembros no estáticos de la clase.

En realidad su sentido exacto es "punteros a objetos (instancias) de clases". Del mismo modo, las instancias de clases pueden referenciarse a través de sus punteros. Más tarde, en uno y otro caso podemos iniciar dichos punteros a instancias concretas. Ya que int no es un objeto concreto de la clase. De sus punteros (esta es justamente la razón de su existencia). Sólo los constructores de las clases admiten inicializadores.

Definición y Propósito de los Constructores

Para personalizar cómo inicializa una clase sus miembros o para invocar funciones cuando se crea un objeto de la clase, defina un constructor. Un constructor tiene el mismo nombre que la clase y no devuelve ningún valor. Normalmente, los constructores tienen accesibilidad pública para que el código que no pertenece a la jerarquía de herencia ni a la definición de la clase pueda crear objetos de la clase. El objeto creado por los constructores se inicializa totalmente en cuanto finaliza cualquiera de los constructores.

Puede definir tantos constructores sobrecargados como sea necesario para personalizar la inicialización de varias maneras. Cada clase, es decir, el constructor puede sobrecargarse. Debe asignar valores iniciales para todos los datos miembro de la clase.

Listas de Inicializadores de Miembros

Opcionalmente, los constructores pueden tomar una lista de inicializadores de miembros. Opcionalmente, un constructor puede tener una lista de inicializadores de miembros, que inicializa los miembros de la clase antes de que se ejecute el cuerpo del constructor. Son preferibles las listas de inicializadores de miembros antes que la asignación de valores en el cuerpo del constructor. Una lista de inicializadores de miembros inicializa directamente los miembros. El identificador debe hacer referencia a un miembro de la clase; se inicializa con el valor del argumento. Es una manera más eficaz de inicializar los miembros de la clase que asignar valores en el cuerpo del constructor.

Lea también: IVA 21% Excel

Si un constructor toma std::initializer_list<T> como parámetro y cualquier otro parámetro tiene argumentos predeterminados, se selecciona ese constructor en la resolución de sobrecarga cuando se crea una instancia de la clase mediante la inicialización directa. Puede usar el elemento initializer_list para inicializar cualquier miembro que pueda aceptarlo. Por ejemplo, supongamos que la clase Box (mostrada anteriormente) tiene un miembro std::vector<string> de tipo m_contents.

Tipos de Constructores

Constructor Predeterminado

Los constructores predeterminados son una de las funciones miembro especiales. También se ha incluido un constructor por defecto que inicializa adecuadamente los objetos creados. Un constructor por defecto sin argumentos. Si se basa en un constructor predeterminado implícito, asegúrese de inicializar los miembros en la definición de la clase, como se muestra en el ejemplo anterior. Sin esos inicializadores, los miembros no se inicializarían y la llamada a Volume() produciría un valor de elemento no utilizado.

Un constructor predeterminado generado por el compilador se definirá como eliminado si algún miembro de la clase no se puede construir de manera predeterminada. Por ejemplo, todos los miembros del tipo de clase y sus miembros de tipo de clase deben tener un constructor predeterminado y destructores a los que se pueda acceder. Si una clase no tiene ningún constructor predeterminado, no se puede crear una matriz de objetos de esa clase únicamente mediante una sintaxis de corchetes.

Constructor de Copia

Un constructor de copia inicializa un objeto copiando los valores de los miembros de un objeto del mismo tipo. Si los miembros de la clase son todos tipos simples, como valores escalares, el constructor de copia generado por el compilador es suficiente y no es necesario definir el suyo propio. Si la clase requiere una inicialización más compleja, debe implementar un constructor de copia personalizado. Por ejemplo, si un miembro de clase es un puntero, debe definir un constructor de copia para asignar nueva memoria y copiar los valores del objeto al que apunta el otro. Al definir un constructor de copia, también debe definir un operador de asignación de copia (=).

Constructor de Movimiento

Un constructor de movimiento es una función miembro especial que mueve la propiedad de los datos de un objeto existente a una nueva variable sin copiar los datos originales. Toma una referencia rvalue como primer parámetro y los parámetros posteriores deben tener valores predeterminados. El compilador elige un constructor de movimiento cuando otro objeto del mismo tipo inicializa el objeto, si el otro objeto está a punto de ser destruido y ya no necesita sus recursos.

Lea también: Guía IVA reducido

Si una clase no define un constructor de movimiento, el compilador genera uno implícito si no hay ningún constructor de copia declarado por el usuario, operador de asignación de copia, operador de asignación de movimiento ni destructor. Si no se define ningún constructor de movimiento explícito o implícito, las operaciones que usarían de otro modo un constructor de movimiento usan el constructor de copia en su lugar.

En el constructor que llama a get_Box(), el valor devuelto es un valor xvalue (valor que va a expirar). No está asignado a ninguna variable y, por lo tanto, está a punto de salir del ámbito. Para proporcionar motivación para este ejemplo, vamos a proporcionar a Box un vector grande de cadenas que representan su contenido. En lugar de copiar el vector y sus cadenas, el constructor de movimiento lo "roba" del valor "box" que va a expirar para que el vector ahora pertenezca al nuevo objeto.

Constructor de Delegación

Un constructor de delegación llama a otro constructor de la misma clase para realizar algunas de las tareas de inicialización. Esta característica es útil cuando tiene varios constructores que todos tienen que realizar un trabajo similar. Puede escribir la lógica principal en un constructor e invocarla desde otros.

Constructores en la Herencia

In C++, constructors are not inherited from a base class to a derived class. Instead, the derived class must explicitly call the appropriate constructor of the base class, either directly or indirectly.

A simple class hierarchy with a Base class and a Derived class. The Derived class inherits publicly from the Base class, meaning all public members of the Base class are accessible in the Derived class. Un constructor de clase derivada siempre llama a un constructor de clase base, por lo que se pueden usar clases base completamente construidas antes de realizar cualquier trabajo adicional.

Lea también: ¿Cómo localizar tus XML del SAT?

En el ejemplo siguiente se muestra el orden en el que los constructores miembros y de clase base se llaman en el constructor para una clase derivada. En primer lugar, se llama al constructor base. A continuación, se inicializan los miembros de clase base en el orden en el que aparecen en la declaración de clase. Si el constructor no delega, se destruirán todos los miembros y objetos de clase base totalmente construidos.

If a class has or inherits virtual functions, initializes the object's virtual function pointers. Derived class default constructor called. Derived Class B: The default constructor of B does not explicitly call the base class constructor using an initializer list. Derived class constructor called.

Derived d1; // OK. En C ++ 17, Derived ahora se considera un tipo de agregado. Eso significa que la inicialización de Base mediante el constructor privado predeterminado se produce directamente como parte de la regla de inicialización de agregados extendida.

Visual Studio 2017 y versiones posteriores: la instrucción using en modo /std:c++17 y versiones posteriores incluye en el ámbito a todos los constructores de la clase base, excepto los que tienen una firma idéntica a la de los constructores de la clase derivada.

Punteros y Compatibilidad de Tipos en Herencia

Puntero-a-clase-derivada a puntero-a-clase-base. The pointer b is of type Base and points to a Base object (obj1). The pointer d is of type Derived and points to a Derived object (obj2). This assignment is valid because Derived inherits from Base. The pointer d is of type Derived, but because the Derived class inherits from the Base class, it has access to the Base class's public members, including print_base().

This assignment is invalid because a pointer to a derived class (Derived*) cannot point to an object of the base class (Base). The pointer b is of type Base and points to a Base object. Since the Base class does not define or know about the print_derived() function, the compiler will throw an error, stating that the function is not a member of the Base class. Function calls like b->print_derived(); highlight the limitations of static binding in C++. This code emphasizes the importance of understanding inheritance, type compatibility, and static vs.

Ejemplos de Operaciones con Punteros a Clases

Un objeto de esa clase.

  • C* ptrd = new C; // L.7: Ok.
  • (*ptrc).x = 10; // L.8: Ok.
  • d.x = (*ptrc).x; // L.9: Ok.
  • ptrc->x = 10; // L.8bis: Ok.
  • d.x = ptrc->x; // L.9bis: Ok.

En el espacio global se ha definido una función f1, que acepta como argumento un puntero a la clase. A continuación, en L.24 se utiliza el puntero cptr como argumento de la función f1. Funcionaba correctamente. En la memoria asignada al objeto. Las clases que contienen miembros de tipo de clase se conocen como clases compuestas. Si una clase contenida carece de un constructor predeterminado, debe utilizar una lista de inicializaciones en el constructor de la clase compuesta.

Constructores Explícitos y Conversiones Implícitas

Si una clase tiene un constructor con un solo parámetro, o si todos los parámetros excepto uno tienen un valor predeterminado, el tipo de parámetro se puede convertir implícitamente en el tipo de clase. Estas conversiones pueden ser útiles en algunos casos, pero lo más habitual es que provoquen errores sutiles, pero graves, en el código. Cuando el constructor es explícito, esta línea provoca un error del compilador: ShippingOrder so(42, 10.8);.

tags: #constructor #de #clase #como #tipo #puntero