Инициализация переменной члена-указателя в классах C ++ - PullRequest
17 голосов
/ 07 декабря 2011

Это прозвучит настолько основательно, что заставит думать, что я приложил ноль усилий, чтобы найти ответ сам, но клянусь, я искал около 20 минут и не нашел ответа.

Если частный c ++Переменная члена класса (нестатическая) является указателем, и она НЕ инициализируется в конструкторе (либо через список инициализации, либо через присваивание в конструкторе), каким будет ее значение, когда экземпляр класса будет полностью создан?

Бонусный вопрос: если ответ на поставленный выше вопрос отличается от NULL, и я хочу всегда инициализировать конкретную переменную-указатель члена в NULL, и у меня есть несколько конструкторов, действительно ли мне нужно явно указывать инициализацию для этого указателяв каждом конструкторе я пишу?И если так, то как профессионалы справляются с этим?Конечно, никто на самом деле не помещает избыточные инициализаторы для одного и того же члена во всех их конструкторах, не так ли?

РЕДАКТИРОВАТЬ: Хотелось бы мне выбрать два ответа здесь.Интеллектуальные указатели, рекомендованные Bleep Bloop, кажутся самым элегантным подходом, и он получил наибольшее количество голосов.Но так как я на самом деле не использовал умные указатели в своей работе (пока), я выбрал наиболее показательный ответ, который не использовал умные указатели в качестве ответа.

Ответы [ 4 ]

10 голосов
/ 07 декабря 2011

Вы думаете правильно.Если вы не инициализируете его, это может быть что угодно.

Таким образом, ответ на ваш вопрос пока еще: либо инициализируйте его чем-нибудь, либо дайте ему NULL (или nullptr, в самом последнем стандарте C ++).

class A
{
};


class B
{
private:
    A* a_;

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

Наш ctor по умолчанию здесь делает его равным NULL (при необходимости заменяется на nullptr), второй конструктор инициализирует его передаваемым значением (что также не обязательно будет хорошим!).

8 голосов
/ 07 декабря 2011

Значение будет неинициализировано, так что да, вам нужно явно инициализировать его как nullptr.

Использование интеллектуальных указателей (std::unique_ptr, std::shared_ptr, boost::shared_ptr и т. Д.) Будет означать, что вам не нужно делать это явно.

1 голос
/ 07 декабря 2011

Значение будет неопределенным.

У вас может быть один «конечный» ctor, который будет инициализировать все поля и добавлять «сокращенные» ctor только с частью параметров, которые будут передавать эти параметры в конечный ctor вместе со значениями по умолчанию для остальные параметры.

1 голос
/ 07 декабря 2011

значение любого неинициализированного указателя всегда мусор, это некоторый случайный адрес памяти.

в ваших конструкторах вы можете использовать списки инициализатора для инициализации вашего указателя

просто

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

попытка ссылки на неинициализированный указатель вызывает неопределенное поведение.поэтому ВСЕГДА инициализируйте указатель.

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