C ++: когда использовать указатели? - PullRequest
16 голосов
/ 18 марта 2009

После прочтения некоторых уроков я пришел к выводу, что всегда следует использовать указатели на объекты. Но я также видел несколько исключений при чтении некоторых руководств по QT (http://zetcode.com/gui/qt4/painting/), где объект QPaint создается в стеке. Так что теперь я в замешательстве. Когда я должен использовать указатели?

Ответы [ 14 ]

1 голос
/ 18 марта 2009

Я на самом деле использую указатели в этой ситуации:

class Foo
{
    Bar* bar;

    Foo(Bar& bar) : bar(&bar) { }

    Bar& Bar() const { return *bar; }
};

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

Dave

1 голос
/ 18 марта 2009

Обычно используют указатели / ссылки на объекты, когда:

  • передача их другим методам

  • создание большого массива (я не уверен, каков нормальный размер стека)

Используйте стек, когда:

  • Вы создаете объект, который живет и умирает в рамках метода

  • Объект имеет размер регистра ЦП или меньше

0 голосов
/ 10 апреля 2009

Говоря о C ++, объекты, созданные в стеке, нельзя использовать, когда программа вышла из области, в которой она была создана. Поэтому, как правило, когда вы знаете, что вам не нужна переменная после функции или после закрывающей скобки, вы может создать его в стеке.

Говоря конкретно о Qt, Qt помогает программисту, обрабатывая много памяти для управления объектами кучи. Для объектов, производных от QObject (почти все классы с префиксом "Q"), конструкторы принимают необязательный параметр parent. Затем родительский объект владеет объектом, и когда родительский объект удаляется, все принадлежащие ему объекты также удаляются. По сути, ответственность за уничтожение детей переходит на родительский объект. При использовании этого механизма в куче должны быть созданы дочерние элементы QObject.

Короче говоря, в Qt вы можете легко создавать объекты в куче, и до тех пор, пока вы устанавливаете правильного родителя, вам придется беспокоиться только об уничтожении родителя. Однако в целом в C ++ вам нужно помнить, чтобы уничтожать объекты кучи или использовать умные указатели.

0 голосов
/ 18 марта 2009

Используйте указатели, когда вы не хотите, чтобы ваш объект был уничтожен при опустошении фрейма стека.

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

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