#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 << . Итак, я решил, что что-то не так с моим пониманием выражения, которое я опубликовал (что, кажется, понятно).