2017-02-15 9 views
1

В коде, разработанном моим профессором, есть класс под названием Node. В этом классе, операторы << и >> перегружены следующим образом:Операторы перегрузки << and >>

// Overloaded write operator 
friend std::ostream& operator<<(std::ostream& os, const Node& obj); 
// Overloaded input operator 
friend std::istream& operator>>(std::istream& is, Node& obj); 

Кто-нибудь знает:

  • Значение const в первой подписи, и поэтому не представляется возможным использовать const во втором один?
  • Цель & после Node во второй подписи.
+1

'const ', как следует из самого слова, означает, что ссылочный объект не модифицируется. Поскольку 'opaerator >>' необходимо изменить 'obj' ... – StoryTeller

+0

Не эти вопросы, которые вы должны были выяснить и ответить сами по себе? Они кажутся такими. – szpanczyk

+1

Об этом говорится в любом вводном тексте на C++. SO не является заменой для одного. –

ответ

1

const Node& obj означает, что аргумент obj является ссылкой на постоянной Node объекта.

Node& obj означает, что аргумент obj является ссылкой на изменяемый (непостоянный) объект Node.

Логика здесь в том, что когда вы читаете, пишите что-то в поток, вам не нужно что-то изменять, поэтому это может быть const. Но когда вы читаете что-то из потока и записываете его на какой-то объект, этот объект не может быть const.

+0

Стоит отметить, что это приводит к (т.вы можете выводить как константные, так и неконстантные узлы, но вы можете вводить только информацию не const const) – SingerOfTheFall

1
  • & Пройдите мимо ссылки. Аргумент, который передается, совпадает с передачей объекта. Никакой копии не происходит. Это необходимо, если вам нужна мутация некоторой переменной в функции.

  • const Только для чтения. Любая модификация этого объекта вызывает ошибку компиляции. Полезно ограничить возможность того, чтобы компилятор помог вам не случайно его изменить.

объект <<ostream должен прочитать прохождение аргумент для вывода на ostream. Поэтому имеет смысл отметить его как const. Маркировка & во избежание ненужной копии.

istream>> к вашему объекту. Читайте из istream, чтобы написать свой объект. Таким образом, вы должны передать его как неконстантную ссылку для обновления некоторых значений вашего передающего объекта.

0

Простейшим способом: const означает, что obj не может быть изменен.

Первой функцией является перегрузка выходного оператора. Он только считывает данные obj и записывает их в выходной поток в той или иной форме.

Вторая функция - перегрузка оператора ввода. Он считывает из входного потока в obj. Это означает, что он изменяет obj. Поэтому obj не может быть отмечен const!

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