Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция_04.pdf
Скачиваний:
7
Добавлен:
10.02.2015
Размер:
182.57 Кб
Скачать

bool operator==(const double cd, const Vector &cv)

{

if (cv.m_Dim != 1) return false;

if (cv.m_pVec[0] != cd) return false; return true;

}

Операторы ввода и вывода

Данные операторы определяютсякак внешние функции, обычно, дружественные по отношению к классу вводимого либо выводимого объекта. Их первый аргумент, а также возвращаемый ими результат должны иметьтип ссылки, соответственно, на поток ввода (иметь тип istream &) или на поток вывода (иметь тип ostream &).

В случае оператора ввода(>>) его второй аргумент должен быть ссылкой на вводимый объект класса. В случае оператора вывода(<<) второй аргумент может быть выводимым объектом класса или ссылкой на выводимый объект класса.

Для класса Complex операторы ввода и вывода могут быть реализованы так:

istream &operator>>(istream &ris, Complex &rz)

{

cin >> rz.m_Re >> rz.m_Im; return ris;

}

ostream &operator<<(ostream &ros, const Complex cz)

{

cout << cz.m_Re; if (cz.m_Im >= 0)

cout << "+"; cout << cz.m_Im << 'i'; return ros;

}

Оператор индексации

Данный оператор должен быть членом класса. Его первым операндом является объект его класса-владельца, а вторым – объект произвольного типа, называемый индексом.

Чаще всего оператор используется для индексации некоторых элементов внутри объекта класса-владельца, поэтому, как правило, он возвращает ссылку на элемент объекта классавладельца. При этом индекс обычно имеет тип size_t.

Для класса Vector оператор индексации может быть определен следующим образом:

double &Vector::operator[](const size_t i)

{

return m_pVec[i];

}

В результате оказывается возможным получение доступа непосредственно к элементам вектора, как, например, показано ниже:

double ard[3] = { 1.1, 2.2, 3.3 }; Vector va(3, ard);

va[0] += 5.5; va[1]++;

va[2] = va[1] * 2.2;

Однако для организации индексации элементов константного вектора потребуются существенные дополнительные усилия, которые здесь не рассматриваются.

Оператор вызова функции

Данный оператор также долженбыть членом класса. Его первым операндом является объект его класса-владельца, а вторым - список формальных аргументов вызова функции.

Аргументы в списке вызова функции могут быть любых типов.

Есть множество применений данного оператора. Одним из таких применений является индексация элементов в многомерном массиве, например, в матрице.

Для класса Matrix оператор вызова функции может быть определен так2:

double &Matrix::operator()(const size_t i, const size_t j)

{

return m_pMat[j * m_Line + i];

}

В результате оказывается возможным получение доступа непосредственно к элементам матрицы, как, например, показано ниже:

const size_t Line(2), Col(3);

double ard[Line * Col] = { 1.0, 0.0, 0.0, 1.0, 3.0, 4.0 }; Matrix mA(Line, Col, ard);

mA(0, 0) += 5.5; mA(0, 1)++;

mA(1, 2) = mA(0, 1) * 2.2;

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

2 Определение класса Matrix можно найти на локальном сервере филиала КФУ в папке дисциплины«ЯиМпр»

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]