Я перехожу с Java на C ++ и меня немного смущает гибкость языка.Один момент заключается в том, что существует три способа хранения объектов: указатель, ссылка и скаляр (сохранение самого объекта, если я правильно его понимаю).
Я склонен использовать ссылки там, где это возможно, потому что это каккак можно ближе к Java.В некоторых случаях, например, для методов получения производных атрибутов, это невозможно:
MyType &MyClass::getSomeAttribute() {
MyType t;
return t;
}
Это не компилируется, поскольку t
существует только в области действия getSomeAttribute()
, и если я возвращаю ссылку на него, он никуда не укажет, прежде чем клиент сможет его использовать.
Поэтому у меня остается два варианта:
- Возвращать указатель
- Возвращать скаляр
Возвращение указателя будет выглядеть так:
MyType *MyClass::getSomeAttribute() {
MyType *t = new MyType;
return t;
}
Это сработает, но клиент должен будет проверить этот указатель на NULL
, чтобы быть действительно уверенным, что-тоэто не обязательно с ссылками.Другая проблема заключается в том, что вызывающий должен убедиться, что t
освобожден, я бы не стал заниматься этим, если смогу избежать этого.
Альтернативой может быть возвращение самого объекта (скаляр):
MyType MyClass::getSomeAttribute() {
MyType t;
return t;
}
Это довольно просто и именно то, что я хочу в этом случае: это похоже на ссылку, и она не может быть нулевой.Если объект находится вне области видимости в коде клиента, он удаляется.Довольно удобно.Однако я редко вижу, чтобы кто-то делал это, есть ли причина для этого?Есть ли какая-то проблема с производительностью, если я возвращаю скаляр вместо указателя или ссылки?
Какой самый распространенный / элегантный подход для решения этой проблемы?