繁体   English   中英

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

[英]Pointer Member Variable Initialization in C++ Classes

这听起来很基础,让人觉得我自己找到答案的努力为零,但我发誓我确实搜索了大约 20 分钟,但没有找到答案。

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

奖励问题:如果上述问题的答案不是 NULL,我希望总是将一个特定的成员指针变量初始化为 NULL,并且我有多个构造函数,我真的必须在每个构造函数中为该指针显式初始化吗我写的构造函数? 如果是这样,专业人士如何处理这个问题? 肯定没有人真的在他们所有的构造函数中为同一个成员放置了冗余的初始值设定项,是吗?

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

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

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

class A
{
};


class B
{
private:
    A* a_;

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

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

该值将是未初始化的,所以是的,您需要将其显式初始化为nullptr

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

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

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

只是

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

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

价值将是不确定的。

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

即使投票最多的答案在技术上是正确的,我建议更好的方法是在类本身中初始化变量。

class A
{
};


class B
{
private:
    A* a_ = nullptr;

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

在 C++ 中,允许使用initialization list语法为成员变量初始化值。 看到这个:

class AnyClass
{
};
class Xyz
{
    int n;
    AnyClass *p;
    Xyz() : n(55), p(new AnyClass())
    {
        // constructor body
    }
    ~Xyz() { delete p; }
};

n的值变为 55 并且指向新创建的 AnyClass 的指针被初始化为p 请注意,它们未分配给np 它们被初始化为成员变量。

使用new时,应使用delete删除它。使用new[]时,应使用delete[]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM