В чем разница между этими двумя локальными переменными? - PullRequest
2 голосов
/ 04 февраля 2011
const std::string  s1("foo");
const std::string& s2("foo");

Не знаю, чем они отличаются, но я вижу доказательства обоих употреблений.Есть идеи?

Ответы [ 4 ]

6 голосов
/ 04 февраля 2011
const std::string s1("foo");

Это объявляет именованный объект std::string как локальную переменную.

const std::string& s1("foo");

Это объявляет константную ссылку на std::string объект.Создается неназванный временный объект std::string с содержимым "foo", и ссылка привязывается к этому временному объекту.Временный объект будет существовать до тех пор, пока ссылка не выйдет из области видимости.

В этом конкретном случае нет заметного различия между ними: в обоих случаях вы получите std::string, к которому можно получить доступ черезимя s1 и которое будет уничтожено, когда s1 выйдет из области видимости.

Однако в некоторых случаях есть разница.Рассмотрим, например, функцию, которая возвращает по ссылке:

const std::string& get_reference_to_string();

Если вы инициализируете s1 результатом вызова этой функции, есть разница между:

const std::string s1(get_reference_to_string());
const std::string& s1(get_reference_to_string());

В первом случае создается копия указанной строки и используется для инициализации s1.Во втором случае s1 просто привязывается к std::string, на который ссылается возвращаемая ссылка: копия не создается.

3 голосов
/ 04 февраля 2011

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

Для ясности и читабельности предпочтите не-ссылку.

0 голосов
/ 04 февраля 2011

const std::string s1("foo"); создает объект std::string в стеке и инициализирует его строкой const char* "foo".const std::string& s1("foo"), с другой стороны, является константной ссылкой на неявно созданный std::string.

0 голосов
/ 04 февраля 2011

Первый экземпляр создает постоянную строковую переменную, инициализированную для хранения «foo».Второй создает постоянную ссылку на строку, а затем инициализирует эту постоянную ссылку, чтобы указать на временную строку, которая была инициализирована для хранения «foo».

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