Зачем нам нужен указатель на класс, если мы можем создать его экземпляр и получить доступ к членам класса? - PullRequest
3 голосов
/ 17 мая 2011


Я немного запутался здесь.Если мы можем создать экземпляр объекта класса и получить доступ к методам-членам, тогда зачем указатель на класс?Есть ли в этом какая-то польза?И когда мы используем указатель на класс и когда мы создаем его экземпляр?

Спасибо.

Ответы [ 3 ]

10 голосов
/ 17 мая 2011

Возможно, вам не нужен указатель на класс. Если ваш класс небольшой, не проявляет полиморфное поведение в базовом классе или не требует каких-либо затрат на создание экземпляра, вы, вероятно, можете просто разорвать его на лету и все будет готово.

Но во многих случаях нам нужны указатели, потому что:

  1. Класс "большой", например, дорогостоящий для создания экземпляров или создания копий. В этом случае мы можем передавать указатели вместо того, чтобы просто создавать их по мере необходимости, чтобы повысить эффективность работы с ОЗУ и ЦП.
  2. Возможно, вы не захотите, чтобы был более одного раза экземпляр класса. Рассмотрим регистратор, который часто реализуется как Singleton . Теперь, по мнению многих, синглтоны "плохие", но использование иллюстрирует тот факт, что иногда создание экземпляра второго экземпляра какого-либо класса может что-то сломать. Поэтому вам нужен указатель (или ссылка) на единственную копию.
  3. Когда вы хотите полиморфное поведение во время выполнения, вам почти наверняка понадобится указатель (или, предпочтительно, ссылка).
7 голосов
/ 17 мая 2011

Если мы можем создать экземпляр объекта класса и получить доступ к методам-членам, тогда зачем указатель на класс?

Если у вас есть только базовый класс и нет производных классов, тогда онхорошо создать объект в стеке, а не указатель на класс.В последнем случае вы должны вызывать delete для указателя, чтобы вернуть ресурсы, полученные new.(Также убедитесь, что стек никогда не переполняется. Если вам нужно большое количество массивов экземпляров, тогда создание экземпляра с использованием new - единственный вариант.)

class foo
{
    int a ;
};

foo obj1 ;
foo obj2 = obj1 ; // Copy construction. Both obj2, obj1 have it's independent
                  // copy of objects. (Deep copy)

foo *obj3 = new foo ;
foo *obj4 = obj3 ; // Copy construction. However, both obj3, obj4 point to the 
                   // same object. (Shallow copy)

                   // You should be careful in this case because deletion of obj3
                   // makes obj4 dangling and vice versa.

Есть ли в этом какая-то польза?

Полиморфизм , поскольку он работает только для указателей / ссылок.

И когда мы используем указатель на класс и когда мы создаем экземпляробъект этого?

Это зависит от требования.Как было сказано ранее, если у вас есть только базовый класс, создание объекта в стеке - лучший вариант.

1 голос
/ 17 мая 2011

Одной из причин может быть производительность. Представьте, что у вас есть 100 экземпляров какого-то класса. Если вы не используете указатели и хотите сделать что-то наподобие копирования этих экземпляров из одного контейнера в другой, это приведет к значительным издержкам, так как для каждого из них потребуется вызывать конструктор копирования. Однако если вместо этого у вас есть указатели на эти экземпляры, то единственное, что действительно копируется, - это указатель, значительно ускоряющий операцию.

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