C++:将成员指针初始化为null?

Nic*_*ner 32 c++ oop initialization-list

我有一个类看起来像:

class Foo
{
public:
    Foo();
    virtual ~Foo();

private:
    Odp* bar;
};
Run Code Online (Sandbox Code Playgroud)

我希望初始化barNULL.这是最好的方法吗?

Foo::Foo() : bar(NULL)
{
}
Run Code Online (Sandbox Code Playgroud)

此外,析构函数是否必须是虚拟的?(如果这是真的,那么构造函数也必须是虚拟的吗?)

gre*_*ade 40

我希望初始化barNULL.这是最好的方法吗?

这是正确的方法.所以,是的.

此外,析构函数是否必须是虚拟的?

不会.如果你要从Foo类继承并且将使用Foo指针来删除那些派生类,析构函数只需要是虚拟的(虽然作为一般经验法则,如果有任何其他虚拟成员,它应该是虚拟的).

(如果这是真的,那么构造函数也必须是虚拟的吗?)

号构造函数既不需要virtual,也可以他们.

  • @Poni:不,你没有,你重新分配他们.所有成员都在构造函数体的开头初始化.这就是为什么在那里"初始化"事物通常被认为是不好的做法.当然,对于原始类型,你什么都不会丢失,但并非所有类型都是原始类型,最好是保持一致.当你更多地使用它们并习惯语法时,会出现"清除". (14认同)
  • @Poni:我说的就是你所说的,我试图指出`m_non_const_var`应该在初始化列表中初始化了.当你说'= OTHER_VALUE`时,你正在分配,而不是初始化.初始化列表用于初始化.:)你的代码会让我想知道你是不是只是不一致或者是否有某些原因无法初始化.构造函数体应该是您运行初始化*类*所需的任何代码的位置,而不是成员. (3认同)

Tyl*_*nry 10

  1. 是的,初始化列表是最好的.

  2. 也许.如果您打算在类中拥有任何其他虚函数,或者您打算继承该类(尽管通常这些事情在一起),则析构函数应该是虚拟的.

  3. 不可以.在C++中使用虚拟构造函数是不可能的.(这样的事情甚至意味着什么?)

你的问题的本质告诉我,你并不真正理解virtual关键字的作用或用途是什么,而你只是复制了别处或教程中看到的内容.最好了解您正在编写的所有代码的用途.这里可能是一个开始的地方:http://www.parashift.com/c++-faq-lite/virtual-functions.html


Joh*_*itb 10

存在四种不同的方式.哪一个是最好的取决于你

Foo::Foo() : bar() // value initialization
{
}

Foo::Foo() : bar(0) // direct null pointer constant
{
}

Foo::Foo() : bar(NULL) // null pointer constant by macro
{
}

Foo::Foo() : bar(nullptr) // pointer literal of type std::nullptr_t
{
}
Run Code Online (Sandbox Code Playgroud)