#c #operator-overloading #pass-by-reference
#c #перегрузка оператора #передача по ссылке
Вопрос:
Я читал о перегрузке операторов и узнал, что если вы возвращаете ссылку из функции, вы можете каскадировать перегруженные операторы.
Мой вопрос заключается в следующем. Чтобы вернуть ссылку, вам нужно передать ссылку на функцию или подойдет значение?
например, оба допустимы?
ostream amp;operator<<(ostream output, string amp;label);
и
ostream amp;operator<<(ostream amp;output, string amp;label);
Будет ли первый также возвращать действительную ссылку на аргумент выходного потока, переданный функции, или вам нужно передать объект выходного потока в качестве ссылки, чтобы вернуть его в качестве ссылки?
Комментарии:
1. Если вы передаете значение, компилятор отправляет копию. Затем вы возвращаете ссылку на копию, а затем строка заканчивается, и копия уничтожается … ваша ссылка висит.
2. Если вы намерены вернуть ссылку на что-то, что передается, это что-то должно быть передано в качестве ссылки. В случае
operator<<()
для потоковой передачи вostream
s,ostream
должно быть передано по ссылке. Передача по значению означает, что возвращается ссылка на временный (аргумент), что вызывает неопределенное поведение.
Ответ №1:
Вы не можете использовать
std::ostream amp;operator<<(std::ostream output, std::string amp;label);
поскольку std::ostream
не имеет конструктора копирования.
Даже если std::ostream
бы у вас был конструктор копирования, использование вышеупомянутого интерфейса вызвало бы следующие проблемы.
Проблема 1
Возврат ссылки на входной аргумент будет проблемой. Объект не будет активен после возврата функции. Следовательно, возвращаемая ссылка будет висячей ссылкой, как только функция вернется. Использование висячей ссылки приведет к неопределенному поведению.
Проблема 2
Это гипотетически.
Представьте, что произойдет, если вы используете:
std::ofstream outfile("myoutput.txt");
outfile << "A string.";
Вызов приведет к разделению объекта. Вы потеряете целостность объекта. std::ofstream
Куда будет отправлен вывод в этой функции? Это, конечно, не перейдет в файл.
Придерживайтесь
std::ostream amp;operator<<(std::ostream amp;output, std::string constamp; label);
PS Да, я изменил тип второго аргумента на constamp;
.
Комментарии:
1. И я понимаю, почему вы добавили ключевое слово const . Спасибо за это 🙂