Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Книга C++.doc
Скачиваний:
24
Добавлен:
10.11.2019
Размер:
2.48 Mб
Скачать

Класс вектор. Часть 2.

Итак, Вы уже познакомились с интерфейсом класса ВЕКТОР. Теперь рассмоторим реализацию класса.

#include <iostream.h>

#include <math.h>

#include "Vector.h"

Vector::Vector()

{ // Конструктор по умолчанию

int n;

cout << "Input array size:\t";

cin >> n; // Запрос размерности вектора

while(n <= 0) // Проверка корректности ввода

{

cout << "Input array size:\t";

cin >> n;

}

size = n;

vect = new double[size]; // Создание вектора заданной длины

}

Vector::Vector(int n)

{

size = n;

vect = new double[size]; // Создание вектора заданной длины

}

Vector::Vector(const double* v, int n)

{

size = n;

vect = new double[size];

for(int i = 0; i < size; i++)// Копирование элементов переданного массива

vect[i] = v[i]; // в компоненты вектора

}

Vector::Vector(const Vector& v)

{ // Конструктор копирования

size = v.size;

vect = new double[size];

for(int i = 0; i < size; i++)

vect[i] = v.vect[i];

}

Vector::~Vector()

{ // Деструктор

delete [] vect;

}

Vector& Vector::operator = (const Vector& v)

{ // Перегруженный оператор присваивания

if(&v == this) // Проверка на присваивание объекта

return *this; // самому себе

// Если передан другой объект, то копируем его

delete [] vect;

size = v.size;

vect = new double[size];

for(int i = 0; i < size; i++)

vect[i] = v.vect[i];

return *this;

}

istream& operator >> (istream& is, Vector& v)

{ // Ввод компонент вектора с клавиатуры

for(int i = 0; i < v.size; i++)

{

cout << "Input vect[" << i << "]:\t";

is >> v.vect[i];

}

return is;

}

ostream& operator << (ostream& os, Vector& v)

{ // Вывод вектора на экран

os << "Vector: (";

for(int i = 0; i < v.size; i++)

{

os << v.vect[i];

if(i == v.size - 1)

os << ")\n";

else

os << ", ";

}

return os;

}

double Vector::operator ! ()

{ // Перегруженный оператор ! для

// вычисления длины вектора

double n = 0.0;

for(int i = 0; i < size; i++)

n += vect[i] * vect[i];

return sqrt(n);

}

Vector& Vector::operator ++ ()

{ // Увеличение всех компонент вектора

// на единицу (префикс)

for(int i = 0; i < size; i++)

vect[i]++;

return *this;

}

Vector& Vector::operator -- ()

{ // Уменьшение всех компонент вектора

// на единицу (префикс)

for(int i = 0; i < size; i++)

vect[i]--;

return *this;

}

Vector Vector::operator ++ (int n) // n - фиктивный параметр

{ // Увеличение всех компонент вектора

// на единицу (постфикс)

Vector temp(*this); // Создание временного объекта и

// инициализация его текущим объектом

// (объектом, для которого вызвалась функция)

for(int i = 0; i < size; i++)// Увеличение компонент вектора на единицу

vect[i]++; // (для текущего объекта)

return temp; // Возврат временного объекта

}

Vector Vector::operator -- (int n) // n - фиктивный параметр

{ // Уменьшение всех компонент вектора

// на единицу (постфикс)

Vector temp(*this); // Создание временного объекта и

// инициализация его текущим объектом

// (объектом, для которого вызвалась функция)

for(int i = 0; i < size; i++)// Уменьшение компонент вектора на единицу

vect[i]--; // (для текущего объекта)

return temp; // Возврат временного объекта

}

double& Vector::operator [] (int n)

{ // Перегруженный оператор индексации

// для проверки выхода за границы массива

if(n < 0) // В случае если индекс меньше нуля,

// то возвращаем нулевой элемент массива

{

cout << "Index of array too small:\tuse zeroth element\n";

return vect[0];

}

else if(n > size - 1) // В случае если индекс больше индекса

// последнего элемента массива,

// то возвращаем последний элемент массива

{

cout << "Index of array too big:\tuse last element\n";

return vect[size - 1];

}

else

return vect[n]; // Возврат заданного элемента массива

}

Vector& Vector::operator + ()

{ // Перегруженный унарный +

return *this;

}

Vector Vector::operator - ()

{ // Перегруженный унарный -

Vector temp(*this); // Создание временного объекта и

// инициализация его текущим объектом

// (объектом, для которого вызвалась функция)

for(int i = 0; i < size; i++)

temp.vect[i] = -vect[i];

return temp; // Возврат временного объекта

}

Vector Vector::operator + (const Vector& v)

{ // Сложение двух векторов с помощью

// перегруженного оператора бинарный +

if(size == v.size) // Если размерности векторов совпадают

{

Vector temp(size); // Создание временного объекта

for(int i = 0; i < size; i++)

temp.vect[i] = vect[i] + v.vect[i];

return temp; // Возврат временного объекта

}

else // Если размерности векторов не совпадают

{

cout << "Different arrays sizes !!!\nArray is truncating...\n";

// Урезаем размерность большего вектора

int s = (size < v.size) ? size : v.size;

Vector temp(s); // Создание временного объекта

for(int i = 0; i < s; i++)

temp.vect[i] = vect[i] + v.vect[i];

return temp; // Возврат временного объекта

}

}

Vector Vector::operator + (double d)

{ // Сложение вектора с числом

Vector temp(*this); // Создание временного объекта и

// инициализация его текущим объектом

// (объектом, для которого вызвалась функция)

for(int i = 0; i < size; i++)

temp.vect[i] += d;

return temp; // Возврат временного объекта

}

Vector& Vector::operator += (const Vector& v)

{ // Перегруженный оператор +=

// для сложения двух векторов

*this = *this + v; // Вызов функции this-<operator=(this-<operator+(v));

return *this;

}

Vector& Vector::operator += (double d)

{ // Перегруженный оператор +=

// для сложения вектора с числом

*this = *this + d; // Вызов функции this-<operator=(this-<operator+(d));

return *this;

}

Vector Vector::operator - (const Vector& v)

{ // Вычитание двух векторов с помощью

// перегруженного оператора бинарный -

if(size == v.size) // Если размерности векторов совпадают

{

Vector temp(size); // Создание временного объекта

for(int i = 0; i < size; i++)

temp.vect[i] = vect[i] - v.vect[i];

return temp; // Возврат временного объекта

}

else // Если размерности векторов не совпадают

{

cout << "Different arrays sizes !!!\nArray is truncating...\n";

// Урезаем размерность большего вектора

int s = (size < v.size) ? size : v.size;

Vector temp(s); // Создание временного объекта

for(int i = 0; i < s; i++)

temp.vect[i] = vect[i] - v.vect[i];

return temp; // Возврат временного объекта

}

}

Vector Vector::operator - (double d)

{ // Вычитание числа из вектора

Vector temp(*this); // Создание временного объекта и

// инициализация его текущим объектом

// (объектом, для которого вызвалась функция)

for(int i = 0; i < size; i++)

temp.vect[i] -= d;

return temp; // Возврат временного объекта

}

Vector& Vector::operator -= (const Vector& v)

{ // Перегруженный оператор -=

// для вычитания двух векторов

*this = *this - v; // Вызов функции this-<operator=(this-<operator-(v));

return *this;

}

Vector& Vector::operator -= (double d)

{ // Перегруженный оператор -=

// для вычитания числа из вектора

*this = *this - d; // Вызов функции this-<operator=(this-<operator-(d));

return *this;

}

double Vector::operator * (const Vector& v)

{ // Умножение двух векторов с помощью

// перегруженного оператора бинарное *

double n = 0.0;

if(size == v.size) // Если размерности векторов совпадают

{

for(int i = 0; i < size; i++)

n += vect[i] * v.vect[i]; // Вычисляем произведение

return n; // Возвращаем произведение

}

else // Если размерности векторов не совпадают

{

cout << "Different arrays sizes !!!\nArray is truncating...\n";

// Урезаем размерность большего вектора

int s = (size < v.size) ? size : v.size;

for(int i = 0; i < s; i++)

n += vect[i] * v.vect[i]; // Вычисляем произведение

return n; // Возвращаем произведение

}

}

Vector Vector::operator * (double d)

{ // Умножение вектора на число

Vector temp(*this); // Создание временного объекта и

// инициализация его текущим объектом

// (объектом, для которого вызвалась функция)

for(int i = 0; i < size; i++)

temp.vect[i] *= d;

return temp; // Возврат временного объекта

}

Vector& Vector::operator *= (double d)

{ // Перегруженный оператор *=

// для умножения вектора на число

*this = *this * d; // Вызов функции this-<operator=(this-<operator*(d));

return *this;

}

int Vector::GetSize()

{ // Функция, возвращающая размерность вектора

return size;

}