вопрос по перегрузке оператора - PullRequest
3 голосов
/ 07 марта 2011

Я пытаюсь понять программу, которая включает следующее определение функции f

void f(String S, const String& r)
{

}

Здесь String в аргументе обозначает класс.Меня смущает различие между определениями этих двух аргументов: «String S» и «const String & r».S должен представлять объект класса String, тогда как насчет r?

Более подробно, f определяется как

void f(String S, const String& r)
{
   int c1 = S[1];  // c1=s.operator[](1).operator char( )
   s[1] ='c';      // s.operator[](1).operator=('c')

   int c2 = r[1];  // c2 = r.operator[](1)
   r[1] = 'd';     // error: assignment to char, r.operator[](1) = 'd'      
 }

Этот фрагмент кода должен показать, как перегрузка оператора, ноэти комментарии мне не сильно помогают.Например, почему r [1] = 'd' не правильно?Спасибо за помощь в понимании этого.

Ответы [ 2 ]

8 голосов
/ 07 марта 2011

const String& r - это постоянная ссылка на строку r.Внутри функции вы получаете доступ к r как String.Разница в том, что на самом деле это ссылка на объект, переданный функции, а S будет копией объекта, переданного функции.Вы можете почти думать об этом так, как будто вы обращаетесь к r через указатель с отсутствием ссылок (хотя это еще не все).

Другой способ взглянуть на это:Вызывающий увидит изменения на r (если это не const), в то время как он не увидит изменений на S.

const просто означает, что функция f не может изменитьr.

Смотри также: https://isocpp.org/wiki/faq/references#overview-refs

0 голосов
/ 07 марта 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...