Ventaja utilizando una lista de inicialización agregado a lo largo de un constructor?

StackOverflow https://stackoverflow.com/questions/902077

  •  05-09-2019
  •  | 
  •  

Pregunta

Soy nuevo en C ++ y tengo una pregunta ...

He intentado responder a la pregunta a mí mismo haciendo una aplicación de prueba ... en la depuración, la inicialización de clase B genera menos código ensamblador, pero en modo de lanzamiento, no se puede decir realmente ... que optimiza las inicializaciones de distancia :(

Vamos a decir que tengo dos clases:

class A
{
public:
    int a, b, c, d;

    A(int _a, int _b, int _c, int _d) : a(_a), b(_b), c(_c), d(_d)
    {
    }
};

class B
{
public:
    int a, b, c, d;
};

¿Hay alguna ventaja de utilizar

B b = {1, 2, 3, 4}

en lugar de

A a = A(1, 2, 3, 4);

¿Fue útil?

Solución

No sé acerca de las ventajas de rendimiento, pero en general se prefiere utilizando el constructor.

Esto es porque con A, los miembros de a, b, c, d se pueden hacer privado. De este modo, se obtiene la encapsulación con su enfoque A, que no tiene en B.

Como diseñador de la clase, se puede hacer cumplir el uso estricto y asignación de variables miembro a través de un constructor. En el B, escenario de clase, no se puede.

Así, mientras que usted puede conseguir un pequeño aumento en Potencia, para el uso de B, apostaría a que sea insignificante, y no se cumpliría el dolor de cabeza potencial de tener miembros de la clase no protegidos.

Otros consejos

Durante los objetos globales y miembros de la clase estática, la lista de inicialización no invoca ningún código en tiempo de ejecución. (Datos de inicialización se almacena directamente en el binario).

Si va a inicializar una gran cantidad de objetos, o si el código constructor es caro / grande, esto puede marcar una notable diferencia en tiempo de carga.

Como se ha dicho, esto es cierto sólo para los datos antiguos de fricción, es decir, todo lo que se puede inicializar con una lista de inicialización en C ++ <0x

Usted no tiene que escribir explícitamente el código de constructor y C utilizando este tipo de inicialización trabaja en C ++.

Si ha complicado las estructuras compuestas de campos campos de datos simples, la inicialización de variables puede ser más fácil con las listas de inicialización que con los constructores:

B barr[5] = {
    {1,2,3,4},
    {5,6,7,8},
    ...
  };

La desventaja de que (actualmente) sólo funciona para las clases simples con variables miembro sólo POD y que los programadores podría no estar muy familiarizado con la sintaxis.

La mayoría de las clases no se utilizan listas de inicialización (por ahora), por lo que es mejor usar un constructor sólo para ser coherente. En C ++ 0x std :: initializer_list existirá para permitir que esta sintaxis para cualquier clase.

A continuación se presentan los escenarios cuando se utiliza lista de inicialización:

  1. En la inicialización de los miembros de datos const no estáticos.
  2. En la inicialización de los miembros de referencia.
  3. En la inicialización de objetos miembro que no tienen constructor por defecto.
  4. En la inicialización de miembros de la clase base.
  5. Cuando el nombre de parámetros del constructor es el mismo que el miembro de datos.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top