Passing "this" to a function from within a constructor?

nescire picture nescire · Jan 15, 2009 · Viewed 16.6k times · Source

Can I pass "this" to a function as a pointer, from within the class constructor, and use it to point at the object's members before the constructor returns?

Is it safe to do this, so long as the accessed members are properly initialized before the function call?

As an example:

#include <iostream>

class Stuff
{
public:
    static void print_number(void *param)
    {
        std::cout << reinterpret_cast<Stuff*>(param)->number;
    }

    int number;

    Stuff(int number_)
        : number(number_)
    {
        print_number(this);
    }
};

void main() {
    Stuff stuff(12345);
}

I thought this wouldn't work, but it seems to. Is this standard behavior, or just undefined behavior going my way?

Answer

MattK picture MattK · Jan 15, 2009

When you instantiate an object in C++, the code in the constructor is the last thing executed. All other initialization, including superclass initialization, superclass constructor execution, and memory allocation happens beforehand. The code in the constructor is really just to perform additional initialization once the object is constructed. So it is perfectly valid to use a "this" pointer in a class' constructor and assume that it points to a completely constructed object.

Of course, you still need to beware of uninitialized member variables, if you haven't already initialized them in your constructor code.