32

我可以从类构造函数中将“this”作为指针传递给函数,并在构造函数返回之前使用它指向对象的成员吗?

只要在函数调用之前正确初始化访问的成员,这样做是否安全?

举个例子:

#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);
}

我以为这行不通,但似乎行得通。这是标准行为,还是只是未定义的行为按照我的方式进行?

4

4 回答 4

33

当你在 C++ 中实例化一个对象时,构造函数中的代码是最后执行的。所有其他初始化,包括超类初始化、超类构造函数执行和内存分配都是预先发生的。构造函数中的代码实际上只是在构造对象后执行额外的初始化。因此,在类的构造函数中使用“this”指针并假设它指向一个完全构造的对象是完全有效的。

当然,如果您还没有在构造函数代码中初始化它们,您仍然需要注意未初始化的成员变量。

于 2009-01-14T23:49:46.813 回答
4

你可以在这里找到一个很好的答案(C++ FAQ)。

调用类的所有继承成员和成员都保证在构造函数的代码执行开始时已构造,因此可以在其中安全地引用。

主要问题是你不应该在this. 大多数时候我都试过了,它最终只是调用了基类的函数,但我相信标准说结果是未定义的。

于 2009-01-14T23:52:49.087 回答
0

作为所提供代码的旁注,我将模板化void*

class Stuff
{
public:
    template <typename T>
    static void print_number(const T& t)
    {
        std::cout << t.number;
    }

    int number;

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

t如果类型没有成员,那么你会得到一个编译错误number

于 2009-01-15T09:32:14.063 回答
-2

安迪,我认为你对标准的未定义部分是错误的。

当您在构造函数中时,“this”是指向一个对象的指针,该对象的类型是您正在创建的对象的基类,这意味着将调用在基类中部分实现的虚函数,并且虚拟表将不会被跟踪。

更多信息在C++ Faq Lite ...

于 2009-01-15T08:12:46.360 回答