2015-04-11 3 views
0
istream & /* <--here */ read(istream &is, Sales_data &item) 
{ 
    double price = 0; 
    is >> item.bookNo >> item.units_sold >> price; 
    item.revenue = price * item.units_sold; 
    return is; 
} 

//main function 
Sales_data total; 
    if (read(cin,total)) 
    { 
     Sales_data trans; 
     read(cin,trans); 
     // ... 

Я не совсем понимаю, что означает эта ссылка в этой функции, я получил ошибку, если удалю ссылку.C++/reference in function

+0

Если вы хотите знать, что такое ссылка, прочитайте свою книгу на C++. –

ответ

1

Ссылка означает, что идентификатор объекта, который возвращается из функции, совпадает с идентификатором, который будет получен вызывающим абонентом. Другими словами, это не копия, это тот же объект. И поскольку возвращаемый объект также является одним из параметров функции, который также принимается по ссылке, возвращаемый объект является тем же, который был передан.

Причина, по которой вы получаете сообщение об ошибке при удалении ссылки, заключается в том, что без он, вы пытаетесь вернуть поток по значению, для которого требуется конструктор копирования. Но std::istream не копируется, его конструктор копирования явно удален.

+0

спасибо, это очень полезно. Могу ли я сказать «если ... скопирован, чем ссылка не требуется»? – XIAODI

+0

@XIAODI Семантически говоря, использование значений по ссылке (более или менее эквивалентное «указателем») сильно отличается от использования их по значению. Передача по значению вызывает конструктор копирования и дает вам новый экземпляр объекта. Если у вас есть объект 1 мегабайт, ссылка на него может быть очень маленькой, но если вы вернетесь по значению, вы сделаете еще один мегабайтный объект. Иногда вам нужно сделать копию, иногда вы этого не делаете, иногда это не имеет смысла. [Поработайте через хорошую книгу] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list), это того стоит! – HostileFork