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.