Меню сайта
Категории раздела
HTML [44] |
Visual C++ и MFC [21] |
c++ [78] |
php [19] |
Javascript [15] |
C# [51] |
загрузки [0] |
XNA
[10]
создание игр с помощью xna
|
Наш опрос
Друзья сайта
Статистика
Онлайн всего: 1
Гостей: 1
Пользователей: 0
Реклама
Главная » Статьи » c++ |
Класс вектор. Часть 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; } | |
Просмотров: 4020 | Рейтинг: 0.0/0 |
Всего комментариев: 0 | |