string - это класс? Тогда второй способ плох, а первый не очень хорош для маленьких объектов. Лучше так:
string get_name();
Если делать со ссылкой, то неудобно создавать/удалять объекты динамически - придётся всё равно преобразовывать к указателю. Если делать с указателем, то динамическое выделение памяти делается без лишних, загромождающих код, преобразований, но для маленьких объектов это нафик не надо, потому что копирование экземпляров в третьем случае относительно дёшево и не требуется явного динамического выделения памяти. Однако, с указателем, если всё сделать по-уму, будет самый быстрый код, но с экземпляром - самый понятный. Так что, решай сам :)
> 1. string *get_name();
> 2. string &get_name()
> 3. string get_name();
Дело вкуса, дело стиля программирования.
Вопросы прозрачности кода при сопровождении.
2 и 3 - способы обычно применяют в функции operator=() или какой аналогичной.
1 - плохой стиль, его не применяют.
void getStringName(string & sourse);
void getStringName(string * sourse);
это нагляднее так как мы передаем ссылку или указатель на объект,
подразумевая что внутри функции произойдет изменение объекта,
но не будет выделена под него память, что не очевидно в 1.
string * get_name()
{
return &string("hi");
}
Этот фрагмент даст ошибку -> рассматривая в общем виде функции
возвращающие такой результат мы не можем предположить, что
происходит в функции а значит код не прозрачный.
string * get_name()
{
string * str = new string("hi");
return str;
}
Память принято выделять в том блоке, где она будет удаляться.
Это стиль не больше не меньше, но лучше стараться программировать
в "хорошем" стиле. (но это все спорно, что лучше а что нет).
Книжки: Маерс и книжка Ален,Голуб
Например ядро Linux - там главное производительность,
не до стиля. Но всеж.