2013-06-20 4 views
5

Для объявления функции, какКак понять функцию ostream & оператор << (ostream & OS, Const символ без знака * ы)

ostream& operator<< (ostream& os, const unsigned char* s); 

Мне интересно, что было возвращено. Ссылка CPP говорит, что возвращает объект ostream. Но почему это ostream & вместо простого ostream?

Спасибо

ответ

1

Потому что вы вернетесь «ОС», как, что вы можете сделать цепочки;

std::cout << "string1" << "string2" << std::endl; 
1

Возврат простых объектов потребует от компилятора генерации копии объекта, но возвращать ссылки нет.

5

Причина, по которой оператор возвращает ostream& (т.е. изменяемой ссылки на ostream объекта), а не копию или пустот в том, что она позволяет цепочки, например, общий пример с std::cout как ostream объекта:

unsigned int i = 2; 
std::cout << "This is a test to print " << "some text and maybe some numbers: " << i << std::endl; 

Здесь цепь два const char* с, в unsigned int и потоковый модификатор, без необходимости разделить их с отдельными линиями, это делает его лучше читать и понимать.

4

Первая причина: std::ostream s не могут быть скопированы вообще (в C++ 11 конструктор копирования фактически delete d). Вы не хотите, чтобы вернуть копию в любом случае, потому что сцепление не будет работать:

std::stringstream s; 
    s << "String1" << "String2"; 

бы не собрать, потому что, потому что копия возвращается при первом вызове оператора не будет превращаться в ссылки, необходимые для второго вызова ,
Создание обоих значений вместо ссылок также не будет работать:

std::stringstream s; 
    s << "String1" << "String2"; 
    assert(s.str() == "String1String2"); 

Ваш код будет компилироваться, но утверждают, потерпит неудачу, потому что объект s остается неизменным после этих звонков, потому что он был принят копией, а не по ссылке.

Вторая причина: все фактические stream объектов, которые будут использоваться, из std::ostream. Если этот параметр был передан копией, вы получите slicing, где вы фактически потеряете объект, который используете.
Это означает, что следующий код не будет работать (если передача по ссылке, но возвращение авторскими и каким-то образом обойти ошибки компиляции?):

std::stringstream s; 
    s << "String1" << "String2" << std::endl; 
    assert(s == "String1String2"); 

s проведет только "String1" в этом случае, потому что, когда вы вернулись std::stringstream копией std::ostream, возвращаемый объект больше не является объектом std::stringstream и вызывает operator<<, который передает "String2" во временный объект, который только что уничтожается до конца.

Это две важные причины, по которым я могу думать, чтобы вернуться по ссылке, а не по значению.

Смежные вопросы