C ++: инициализировать указатель члена на ноль? - PullRequest
32 голосов
/ 07 июля 2010

У меня есть класс, который выглядит следующим образом:

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

private:
    Odp* bar;
};

Я хочу инициализировать bar в NULL.Это лучший способ сделать это?

Foo::Foo() : bar(NULL)
{
}

Кроме того, необходимо ли, чтобы деструктор был виртуальным?(Если это так, то должен ли конструктор быть виртуальным?)

Ответы [ 7 ]

41 голосов
/ 07 июля 2010

Я хочу инициализировать bar до NULL.Это лучший способ сделать это?

Это правильный способ.Итак, да.

Кроме того, необходимо ли, чтобы деструктор был виртуальным?

Нет.Деструктор должен быть виртуальным, только если вы будете наследовать от класса Foo и будете использовать указатель Foo для удаления этих производных классов (хотя, как правило, он должен быть виртуальным, если есть какие-либо другие).виртуальные члены).

(Если это так, то должен ли конструктор также быть виртуальным?)

Нет.Конструкторы ни не должны быть virtual, ни не могут они.

10 голосов
/ 07 июля 2010

Существует четыре различных способа.Какой из них лучший, зависит от вас

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
{
}
10 голосов
/ 07 июля 2010
  1. Да, список инициализатора лучше.

  2. Возможно.Деструктор должен быть виртуальным, если вы хотите иметь какие-либо другие виртуальные функции в классе или если вы хотите, чтобы класс был унаследован (хотя обычно это происходит вместе).,Невозможно иметь виртуальный конструктор в C ++.(что бы такое даже значило ?)

Характер вашего вопроса подсказывает мне, что вы не понимаете, что делает ключевое слово virtualили для чего, и вы просто копируете то, что видели в другом месте или в учебнике.Лучше понять цель всего кода, который вы пишете.Здесь может быть место для начала: http://www.parashift.com/c++-faq-lite/virtual-functions.html

4 голосов
/ 07 июля 2010
  1. Да
  2. Относительно вашего второго вопроса о виртуальности деструктора, см .: http://www.parashift.com/c++-faq-lite/virtual-functions.html#faq-20.7 Краткий ответ: в вашем случае нет необходимости в деструкторе, чтобы быть жизнеспособным.
  3. Виртуальных конструкторов не существует.
3 голосов
/ 07 июля 2010

Другой вариант, который вы можете рассмотреть, - использовать класс интеллектуальных указателей (например, boost::scoped_ptr, boost::shared_ptr или C ++ 0x unique_ptr) вместо необработанного указателя.Конструктор умного указателя удостоверится, что он инициализируется чем-то вроде NULL, если вам не нужна какая-то другая явная инициализация.Интеллектуальный указатель также гарантирует, что указанный объект уничтожен.

Вам просто нужно решить, какая политика смарт-точек подходит для элемента, и выбрать соответствующий вариант (даже auto_ptr может быть лучшенеобработанный указатель, если вы знаете о различных ловушках).

2 голосов
/ 07 июля 2010

1, да

2, только если вы хотите, чтобы кто-то мог наследовать от вашего класса и использовать указатель на базовый класс - но все равно сделайте виртуальный dtor

3, нет, у вас не может быть виртуального ctor (или все ctor являются виртуальными, я полагаю?)

0 голосов
/ 29 июля 2014

Виртуальные функции определяют, какая функция класса (которая определена как в базовом, так и в производном классе) должна вызываться во время выполнения. Но когда объект создан, компилятор знает, какой конструктор должен быть вызван. например когда базовый объект создан, базовый конструктор вызывается и одинаков для производного класса. Следовательно, делать конструктор виртуальным не имеет никакого смысла. Но однажды, когда указатель объекта базового класса указывает на объект производного класса, а затем вызывается деструктор, компилятор запутывается, какой деструктор (любой из производных от базора) должен быть вызван, может быть решена только с использованием таблицы поиска vtable, поэтому деструктор должен быть виртуальным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...