Какое эмпирическое правило вы используете, чтобы решить, когда что-то должно быть постоянным или нет?
Используйте его везде, где сможете. Тогда не используйте его, когда вам нужно изменить объект или предоставить доступ к чему-то, что может изменить объект (то есть вернуть ссылки или прокси во внутреннее состояние).
Третий, вероятно, бессмыслица, потому что ссылки всегда постоянны, верно?
Нет, это не правильно. Ссылка - это псевдоним, а не переменная. Следовательно, вы не можете изменить, на какую переменную указывает «ссылка», как это можно сделать с помощью указателя. Однако у вас может быть ссылка на изменяемый объект (std::string&
).
Какая разница между всеми этими методами ToString?
Все они в значительной степени различаются по методам управления памятью, но на высоком уровне они все делают одно и то же, за исключением следующего:
char* ToString();
Это ont возвращает указатель на изменяемый массив символов (предположительно, внутреннего состояния).
Обратите внимание, что семья:
char const* ToString();
const char* ToString(); // or this?
const char const* ToString(); // Is this legal?
- это разные способы написать одно и то же. Все нативные типы являются константными, когда возвращаются по значению, независимо от того, пишете вы это или нет.
Следующие 2 являются предпочтительным способом (при условии дополнительного const
в конце) возврата строк в C ++:
string ToString(); // this one?
const string& ToString(); // or this?
Какой из двух вы будете использовать, зависит от того, откуда вы получаете значение. Если строка является членом данных, я предлагаю вам перейти к последнему, потому что это обычно быстрее, хотя и не так много, если ваша строковая реализация использует семантику Copy-On-Write. Если вам нужно вычислить значение и вернуть его, вы должны использовать первое, потому что вы не можете вернуть ссылку на локальную переменную.
Следующие два верны, но я все же рекомендую использовать std::string
const char* ToString() const; // or this?
const char const* ToString() const; // how about this?