es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Qué función miembro especial se utiliza para la inicialización de copia en C++?

Estoy probando la inicialización de una clase en c++.

“`c++
class Point
{
private:
int x,y;
public:
Point() = delete;
Point(int a):x(a), y(0) { std::cout << "Conversión" << std::endl;}
Point(const Point&) { std::cout << "Constructor de copia" << std::endl;}
Point& operator=(const Point&) = delete;

<pre><code>Point(Point&&) = delete;
Point& operator=(Point&&) = delete;
</code></pre>

};

int main()
{
Point p1(5); //caso 1
Point p2 = 5; //caso 2

<pre><code>return 0;
</code></pre>

}
“`

En el código anterior, pensé que “5” se convertiría en un objeto temporal a través del constructor de conversión tanto para el caso 1 como para el caso 2 al principio. Y luego, esperaba que el constructor de copia se usara para inicializar p1 y p2. Pero no fue así.
Cuando ejecuté este código, solo vi dos mensajes de “Conversión” en la consola. No hubo mensajes de “Constructor de copia”.

Incluso si eliminé todos los constructores de copia, constructores de movimiento, operadores de asignación de copia y operadores de asignación de movimiento, este código funcionó correctamente.

Agradecería si me pudiera decir qué función miembro especial se usará para la inicialización después de crear un objeto temporal para “5”.

Estoy usando el compilador g++ con la opción std=c++17.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Basándose en el código proporcionado, la función miembro especial que se está utilizando para inicializar después de crear un objeto temporal para “5” es el constructor de conversión. Esto se debe a que el constructor Point(int a) toma un argumento entero y no está marcado como explicit, por lo que se puede utilizar para la conversión implícita de un entero a un objeto Point.

    Tanto en case1 como en case2, se crea un objeto Point temporal con int a establecido en 5 utilizando el constructor de conversión. Este objeto temporal se utiliza entonces para inicializar p1 y p2 respectivamente. Dado que se está utilizando el objeto temporal para una inicialización directa, no se llama al constructor de copia.

    Es importante tener en cuenta que si el constructor de copia estuviera eliminado explícitamente (descomentando //Point(const Point&) = delete;), entonces la inicialización directa en case2 no se compilaría ya que requeriría un constructor de copia. Sin embargo, la inicialización directa en case1 seguiría funcionando ya que no implica copiar el objeto temporal.

Comments are closed.