C ++类中的指针成员变量初始化

时间:2011-12-06 21:13:31

标签: c++ pointers

这听起来很基本,以至于让我觉得自己没有努力找到答案,但我发誓我搜索了大约20分钟而没有找到答案。

如果私有c ++类成员变量(非静态)是指针,并且它未在构造函数中初始化(通过初始化列表或构造函数中的赋值),那么当类是什么时它的值是什么?完全实例化了吗?

额外问题:如果上述问题的答案不是NULL,并且我希望始终将特定成员指针变量初始化为NULL,并且我有多个构造函数,我是否真的必须为此进行显式初始化我写的每个构造函数中的指针?如果是这样,专业人士如何处理这个?当然没有人真正为所有构造函数中的同一成员添加冗余初始值设定项,是吗?

编辑:我希望我能在这里选择两个答案。 Bleep Bloop推荐的智能指针似乎是最优秀的方法,并获得了最多的投票。但是由于我在工作中实际上没有使用智能指针(但是),我选择了最不具有智能指针的说明性答案作为答案。

4 个答案:

答案 0 :(得分:9)

你的想法正确。如果你没有初始化它,它可能是任何东西。

所以你的问题的答案是,或者用某个东西初始化它,或者给它一个NULL(或者在最新的C ++标准中为nullptr)。

class A
{
};


class B
{
private:
    A* a_;

public:
    B() : a_(NULL) { };
    B(a* a) : a_(a) { };
};

这里我们的默认ctor使它为NULL(如果需要,用nullptr替换),第二个构造函数将使用传递的值初始化它(也不保证是好的!)。

答案 1 :(得分:8)

该值将是未初始化的,所以是的,您需要明确地将其初始化为nullptr

使用智能指针(std::unique_ptrstd::shared_ptrboost::shared_ptr等)意味着您无需明确地执行此操作。

答案 2 :(得分:1)

任何未初始化的指针的值总是垃圾,它是一些随机存储器地址。

在构造函数中,您可以使用初始化列表来初始化指针

简单地

MyClass::MyClass() : myPointer(nullptr)
{
}

尝试引用未初始化的指针会触发未定义的行为。 所以总是初始化你的指针。

答案 3 :(得分:1)

价值未定义。

你可能有一个“终极”ctor,它会初始化所有字段并添加只有部分参数的“short-cut”ctors,它们会将这些参数传递给最终ctor以及默认值其余的参数。