我有一个看起来像这样的课程:
class Foo
{
public:
Foo();
virtual ~Foo();
private:
Odp* bar;
};
我希望将bar
初始化为NULL
。这是最好的方法吗?
Foo::Foo() : bar(NULL)
{
}
此外,析构函数是否必须是虚拟的? (如果这是真的,那么构造函数也必须是虚拟的吗?)
答案 0 :(得分:41)
我希望将
bar
初始化为NULL
。这是最好的方法吗?
这是正确的方式。所以,是的。
此外,析构函数是否必须是虚拟的?
没有。如果您将从Foo
类继承并且将使用Foo
指针删除这些派生类,则析构函数只需要是虚拟的(尽管作为一般经验法则,它应该是虚拟的,如果还有其他虚拟成员。)
(如果这是真的,那么构造函数也必须是虚拟的吗?)
没有。构造函数既不需要为virtual
,也
答案 1 :(得分:10)
是的,初始化列表最好。
也许。如果你打算在类中有任何其他虚函数,或者你打算继承类(尽管通常这些东西都在一起),析构函数应该是虚拟的。
没有。在C ++中使用虚拟构造函数是不可能的。 (甚至意味着什么??
您的问题的性质告诉我,您并不真正理解virtual
关键字的作用或用途是什么,而您只是复制您在其他地方或教程中看到的内容。最好了解您正在编写的代码所有的目的。这里可能是一个开始的地方:http://www.parashift.com/c++-faq-lite/virtual-functions.html
答案 2 :(得分: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
{
}
答案 3 :(得分:4)
答案 4 :(得分:3)
您可能需要考虑的另一个选项是使用智能指针类(例如boost::scoped_ptr
,boost::shared_ptr
或C ++ 0x的unique_ptr
)而不是原始指针。如果您不需要其他显式初始化,智能指针的构造函数将确保它被初始化为NULL状态。智能指针还将确保指向对象被破坏。
您只需确定哪种智能点策略适合该项目并进行相应选择(即使auto_ptr
可能比原始指针更好,只要您了解各种陷阱)。< / p>
答案 5 :(得分:2)
1,是的
2,只有当你希望某人能够从你的类中派生出来并使用指向基类的指针时 - 无论如何都要使dtor成为虚拟
3,你不能拥有一个虚拟的ctor(或者我认为所有的ctors都是虚拟的吗?)答案 6 :(得分:0)
虚函数用于确定在运行时必须调用哪个类的函数(在基类和派生类中定义)。但是当创建对象时,编译器知道要调用哪个构造函数。例如。创建基础对象时,将为派生类调用基础构造函数和相同的基础构造函数。因此,使构造函数成为虚拟没有任何意义。但是,当基类对象指针指向派生类对象,然后调用析构函数时,编译器会混淆需要调用哪个析构函数(基函数派生的),这是只能使用查找表vtable解析,因此析构函数需要是虚拟的。