c++ - studio - ¿Cómo se llama la asignación a través de llaves? y puede ser controlado?
programacion android pdf 2018 (1)
¿Como se llama esto?
Vec3 foo = {1,2,3};
¿Se puede controlar a través de un operador o algo así? ¿Cómo puedo especificar cómo debe actuar esto?
Por ejemplo, si tuviera alguna clase complicada, ¿podría usar esto para asignar variables? (Sólo un ejercicio de curiosidad).
Eso no es tarea. Eso es la inicialización.
Dicha inicialización está permitida solo para el agregado, que incluye la clase POD. POD significa tipo de datos antiguo simple.
Ejemplo,
//this struct is an aggregate (POD class)
struct point3D
{
int x;
int y;
int z;
};
//since point3D is an aggregate, so we can initialize it as
point3D p = {1,2,3};
Ver la compilación anterior bien: http://ideone.com/IXcSA
Pero nuevamente considere esto:
//this struct is NOT an aggregate (non-POD class)
struct vector3D
{
int x;
int y;
int z;
vector3D(int, int, int){} //user-defined constructor!
};
//since vector3D is NOT an aggregate, so we CANNOT initialize it as
vector3D p = {1,2,3}; //error
Lo anterior NO se compila. Da este error:
prog.cpp: 15: error: llaves alrededor del inicializador para el tipo no agregado ''vector3D''
Véase usted mismo: http://ideone.com/zO58c
¿Cuál es la diferencia entre point3D
y vector3D
? Solo el vector3D
tiene un constructor definido por el usuario, y eso lo hace no POD. Por lo tanto, no se puede inicializar utilizando llaves.
¿Qué es un agregado?
La Norma dice en la sección §8.5.1 / 1,
Un agregado es una matriz o una clase (cláusula 9) sin constructores declarados por el usuario (12.1), sin miembros de datos no estáticos privados o protegidos (cláusula 11), sin clases base (cláusula 10) y sin funciones virtuales (10.3) ).
Y luego dice en §8.5.1 / 2 que,
Cuando se inicializa un agregado, el inicializador puede contener una cláusula inicializadora que consiste en una lista de cláusulas inicializadoras, separadas por comillas, para los miembros del agregado, escritas en subíndice creciente o orden de miembro. Si el agregado contiene subagregados, esta regla se aplica recursivamente a los miembros del subagregado.
[Example:
struct A
{
int x;
struct B
{
int i;
int j;
} b;
} a = { 1, { 2, 3 } };
initializes a.x with 1, a.b.i with 2, a.b.j with 3. ]