¿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.
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 comoexplicit
, por lo que se puede utilizar para la conversión implícita de un entero a un objetoPoint
.Tanto en
case1
como encase2
, se crea un objetoPoint
temporal conint a
establecido en5
utilizando el constructor de conversión. Este objeto temporal se utiliza entonces para inicializarp1
yp2
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 encase2
no se compilaría ya que requeriría un constructor de copia. Sin embargo, la inicialización directa encase1
seguiría funcionando ya que no implica copiar el objeto temporal.