Как перегруженный оператор ostream интерпретирует это выражение перегруженных операторов?

#c

#c

Вопрос:

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

В любом случае, это моя проблема. Рассмотрим этот фрагмент кода:

 int main()
{ 
   myArray list_Array(10);

   int i;

   cout << "list_Array : ";
   for (i = 0 ; i < 10; i  )
       cout << list_Array[i] <<" ";
   cout<< endl;

   ...
 

Здесь myArray class — это просто массив с дополнительными гарантиями, такими как проверка привязки. Здесь << оператор перегружен в дополнение к [] тому, что оператор перегружен. Я уже перегрузил последний оператор, и я начал писать реализацию для перегрузки << .

Тем не менее, я начал задаваться вопросом, как isStream будет интерпретировать эту часть выражения: list_Array[i] .

Чтобы объяснить, я обычно мог бы перегрузить этот оператор чем-то вроде этого:

 ostreamamp; operator<< (ostreamamp; isObject, someObjectamp; x)
{
    isObject << x.length;
    return isObject;
}
 

В данном случае то, что я передаю, — это не просто сам объект. Вместо этого я хочу печатать list_Array[i] .

Ради деталей, это общая функциональность этой перегрузки:

 const intamp; myArray::operator[](int index) const
{
    return list[index];
}
 

Тем не менее, как обрабатывается это выражение? Какая перегрузка будет применена первой? Если перегруженный << оператор применяется первым, нужно ли мне изменять параметр, который я передаю в << реализацию?

Приветствуется любой конструктивный вклад.

ПРИМЕЧАНИЕ: list это динамический массив.

Комментарии:

1. Я не понимаю, о чем вы спрашиваете. Вы говорите о << или >> ?

2. Извините, я скопировал не ту функцию. Я говорю о <<. Я отредактирую его.

Ответ №1:

Тем не менее, как обрабатывается это выражение? Какая перегрузка будет применена первой? Если сначала применяется перегруженный оператор << , нужно ли мне изменять параметр, который я передаю в реализацию << ?

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

[] сначала выполняется, и результат передается вашему перегруженному << оператору. Это верно независимо от перегрузки; операнды оператора не могут повлиять на его приоритет.

Очевидно, что оператор << перегружен в дополнение к перегружаемому оператору []

Это совсем не очевидно. Вам нужно будет перегрузить только << в том случае, если ваш массив содержит какой-то объект, для которого у ostreams еще нет operator<< for . Ваш перегруженный [] , похоже, возвращает int s, так что нет абсолютно никакой причины писать свой собственный << оператор для работы ostream .

В данном случае то, что я передаю, — это не просто сам объект. Вместо этого я хочу напечатать list_Array[i] , который является операцией над моим объектом.

Вы не «печатаете операцию». Операция выполняется независимо от печати, и результат операции передается вашему << компьютеру. Результатом будет int возвращенный вами operator[] результат .

Комментарии:

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

2. Я не могу комментировать IntelliSense или то, как вы интерпретируете его «мнение». Вам придется выразиться гораздо яснее, чем это.

3. Что побудило меня задать этот вопрос, так это ошибка IntelliSense, которая гласит: ни один оператор «<<» не соответствует этим операндам, которые являются std::ostream << . Итак, я решил, что что-то не так с моим пониманием выражения, которое я опубликовал (что, кажется, понятно).