Pregunta

Para alguna clase C:

C* a = new C();

C* b(a);  //what does it do?

C* b = a;  //is there a difference?
¿Fue útil?

Solución

C * b (a) y C * b = a son equivalentes. Al igual que en muchos idiomas, hay más de una forma de hacerlo ...

Otros consejos

Tenga en cuenta que en

C* a = new C();
C* b(a);  

b es un puntero a un objeto C que tiene asignado el mismo valor que a. Sin embargo,

#include "somefile.h"
C* b(a);  

podríamos definir fácilmente b como una función que toma un objeto de tipo a, y devuelve un puntero a C.

El estándar describe los diferentes tipos de inicialización es 8.5, y estos dos específicamente bajo 8.5 / 12.

C* b(a);  //what does it do?

Esto se llama inicialización directa . Si 'b' tenía un tipo de clase, entonces el compilador realizaría una resolución de sobrecarga en los constructores en C usando 'a' como argumento. Para un tipo de puntero, simplemente inicializa 'b' con 'a'.

C* b = a;  //is there a difference?

El estándar considera que estos son diferentes en algunos casos, la sintaxis anterior se llama copia de inicialización . En cuanto a la inicialización directa ya que 'b' no es un tipo de clase, entonces se inicializa con el valor de 'a'. Si 'a' y 'b' son del mismo tipo de clase, se usa inicialización directa .

Donde 'b' es un tipo de clase y 'a' tiene un tipo diferente (clase o no), entonces las reglas son ligeramente diferentes (8.5 / 14-b1.b3). Así que para el siguiente código:

C b = a;

En primer lugar, se intenta convertir 'a' al tipo 'C' y luego este objeto temporal se usa para inicializar 'b'. Esto es importante, ya que puede tener una situación en la que inicialización directa se realiza correctamente pero se produce un error en la inicialización de copia :

class A {
public:
  operator int ();
};

class B {
public:
  B (int);
};

void foo ()
{
  A a;
  B b1 (a);  // Succeeds
  B b2 = a;  // Fails
}
  1. C * a = nuevo C (); Ahora está creando un puntero de tipo C, que también asigna nuevos memoria mediante el uso de nuevas palabras clave ....
  2. La siguiente declaración depende de su lógica de constructor . DO* licenciado en Letras); // ¿qué hace?
  3. Su primera y tercera declaración son equivalente. C * b = a; //Hay un diferencia?

El primero crea una nueva instancia de C y coloca su dirección en a.

El segundo es una declaración de puntero a función. Este puntero puede apuntar a cualquier función que tome un argumento de tipo a y devuelva un puntero a un objeto de tipo C.

El tercero declara b, un puntero a un objeto de tipo C y lo inicializa con a.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top