Constructores y destructores son dos lugares donde 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. Además, cuando se está haciendo un prototipo inicial de un programa escribiendo código rápidamente, a menudo es conveniente usar funciones inline. Pero si está preocupado por la eficiencia, es un sitio donde mirar.