sirven sirve signos que puntuacion punto programacion parentesis para los ejemplos corchetes coma asterisco c++ initialization

c++ - sirve - inicialización: paréntesis vs. signo igual



parentesis ejemplos (4)

Posible duplicado:
¿Hay alguna diferencia en C ++ entre la inicialización de la copia y la inicialización de la asignación?

Cuál es la diferencia entre

T a(b);

y

T a = b;

y

T a = T(b);

?


El operador = invocará el constructor de copia predeterminado a menos que el operador = esté sobrecargado, creo ... esto haría una copia superficial; asignando los mismos valores de miembro al primer objeto como el operador de la derecha


Son todas llamadas de constructor, el signo = es solo azúcar sintáctico. Exactamente a qué fabricantes se llama es hasta cierto punto hasta el compilador.


T a( b );

es una inicialización directa , a menos que se analice como una declaración de función, en cuyo caso se trata de una declaración de función.

T a = b;

es la inicialización de la copia , lo que significa que funciona como si se construyera un objeto temporal en el lado derecho, y que a se copia luego construido o, en C ++ 11 y posterior, posiblemente se mueva construido, desde ese temporal.

El compilador puede eludir (eliminar) temporalmente el copiado / movimiento siempre que sea posible, pero un constructor de copia o movimiento, cualquiera que sea el que se use lógicamente, debe seguir siendo accesible y no explicit .

Por ejemplo, en C ++ 03 no puede copiar-inicializar un std::ostringstream , porque no tiene un constructor de copia. En C ++ 11 puede copiar-inicializar un ostringstream si el inicializador es temporal, lo que da como resultado una construcción de movimiento lógico (que, sin embargo, generalmente se eliminará, se optimizará). Por ejemplo, esta declaración de inicialización de copia,

ostringstream s = ostringstream( "blah" );

... no compila como C ++ 03, porque en C ++ 03 la inicialización de copia invoca el constructor de copia de la clase, que no existe. Sin embargo, compila como C ++ 11, porque en C ++ 11 la inicialización de copia invoca el constructor de movimiento. Y mientras (para mantener su ilusión de ser una secuencia) std::ostringstream no se puede copiar directamente, se puede mover.

Otra diferencia: en C ++ 03 solo la sintaxis de copia de copia de seguridad admite el inicializador de llaves , que en C ++ 03 se puede usar cuando T es un tipo de agregado, como una matriz sin formato. En C ++ 11 la notación de llaves se ha extendido y generalizado como una sintaxis de inicialización uniforme , por lo que se puede utilizar también con inicialización directa. Y entonces la siguiente declaración de inicialización directa,

int v[]{ 3, 1, 4, 1, 5, 9, 2, 6, 5, 4 };

... no se compila como C ++ 03, pero se compila como C ++ 11 y posterior.

La sintaxis de inicialización = copy es la sintaxis de inicialización original de C.

Y en C ++ 11 y posterior, debido a la semántica del movimiento, se puede usar en un rango de casos mucho más amplio que en C ++ 03, como con std::ostringstream .


T a(b);

Llama a un constructor de a que acepta b . (Si b es del mismo tipo, entonces se llama al constructor de copia).

T a = b;

un objeto temporal de tipo T se crea para ser construido por b . Entonces se llama al constructor de copia ( = no es una asignación en este caso y el siguiente caso!).

T a = T(b);

¡Lo mismo que arriba! excepto que construimos explícitamente un objeto temporal.

Tenga en cuenta que el estándar permite la eliminación total de copias temporales en el segundo y tercer caso. Además, si b no es de tipo T , entonces en el primer caso T no tiene que tener un constructor de copia. En el segundo y tercer caso, aunque la implementación es gratuita para optimizar todo, aún requiere un constructor de copia accesible. IIRC el estándar llama a esto: copiar elisión .