9.4.3. Actividades ocultas en contructores y destructores

Constructores y destructores son dos lugares dónde puede engañarse al pensar que una inline es más eficiente de lo que realmente es. Constructores y destructores pueden tener actividades ocultas, porque la clase puede contener subobjetos cuyos constructores y destructores deben invocarse. Estos subobjetos pueden ser objetos miembro (atributos), o pueden existir por herencia (tratado en el Capítulo 14). Como un ejemplo de clase con un objeto miembro:

//: C09:Hidden.cpp
// Hidden activities in inlines
#include <iostream>
using namespace std;

class Member {
  int i, j, k;
public:
  Member(int x = 0) : i(x), j(x), k(x) {}
  ~Member() { cout << "~Member" << endl; }
};

class WithMembers {
  Member q, r, s; // Have constructors
  int i;
public:
  WithMembers(int ii) : i(ii) {} // Trivial?
  ~WithMembers() {
    cout << "~WithMembers" << endl;
  }
};

int main() {
  WithMembers wm(1);
} ///:~

Listado 9.14. C09/Hidden.cpp


El constructor para Member es suficientemente simple para ser inline, dado que no hay nada especial en él - ninguna herencia u objeto miembro está provocando actividades ocultas adicionales. Pero en la clase WithMembers hay más de lo que se ve a simple vista. Los constructores y destructores para los atributos q, r y s se llaman automáticamente, y esos constructores y destructores también son inline, así que la diferencia es significativa respecto a métodos normales. Esto no significa necesariamente que los constructores y destructores deban ser no-inline; hay casos en que tiene sentido. También, cuando se está haciendo un prototipo inicial de un programa escribiendo código rápidamente, es conveniente a menudo usar inlines. Pero si está preocupado por la eficiencia, es un sitio donde mirar.