2013-06-02 2 views
2

Допустим, у нас есть объект, созданный статически (Type mObject;), который подвергается программисту с помощью метода getObject(). Интересно, каковы преимущества и недостатки в получении объекта такими способами?Получение объекта с указателем и ссылкой

Type* SomeClass::getObject() { 
    return &mObject; 
} 

// the programmer types 
Type* obj = someClassObj.getObject(); 
obj->someMethod(); 

и таким образом:

Type& SomeClass::getObject() { 
    return mObject; 
} 

// the programmer types 
Type& obj = someClassObj.getObject(); 
obj.someMethod(); 
+1

Бывший API почти поощряет программиста к вызову 'delete', когда он сделан с объектом, или, по крайней мере, оставляет его задающимся вопросом, как очистить. –

+3

В первом случае вам придется документировать, кому принадлежит возвращенный указатель, и надеемся, что клиенты прочитают документы. Обратите внимание, что оба имеют проблемы с константой. – juanchopanza

+0

В первом случае вы можете вернуть NULL, поэтому вызывающему нужно проверить это. – spiritwolfform

ответ

5

В чистом C++, мы используем указатели довольно редко. Особенно сырьевые указатели.

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

  • когда вы хотите NULL, чтобы указать отсутствие
  • , когда вы хотите переключиться на различные объекты (переназначить указатель)
  • при передаче собственности

Ваш пример соответствует ни категории, поэтому вы используете ссылку. Это передает пользователю сообщение о том, что объект всегда будет там. Таким образом, есть время, затрачиваемое на исправление obj, вы можете просто пойти с someClassObj.getObject().someMethod(). В первом случае требуется проверка NULL между ними.

+0

отличный, полный и лаконичный! – davka

1

Возврат указателя вызывает много неоднозначности/вопросов (может ли он быть NULL? Должен ли я delete?), Возвращая ссылку на этот статический экземпляр, вводит гарантии. А именно, что объект всегда будет выделен и всегда будет возвращать экземпляр (технически, что статический экземпляр не может быть сконструирован, если вы обращаетесь к нему во время инициализации).

Хотя реализация определена, все реализации, которые я знаю, используют указатели «под капотом» при передаче по ссылке (в худшем случае). Таким образом, нет никакой дополнительной стоимости для использования ссылки, если не будет введена копия или реклама.

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

Смежные вопросы