Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Метод рекомендации АЯ 2 семестр2.docx
Скачиваний:
113
Добавлен:
23.03.2016
Размер:
1.14 Mб
Скачать

Пример выполнения работы

Для решения задачи в среде Microsoft Visual Studio 2013 было создано стандартное консольное приложение (проект типа Win32 Console Application). Исходные коды основного файла проекта (файла с расширением .cpp) и файла stdafx.h приведены ниже.

Листинг программы с комментариями:

// Project3.cpp: определяет точку входа для консольного приложения.

//

#include "stdafx.h"

class Vector // Класс- вектор

{

double *p; // Указатель на массив (вектор)

int n; // Размерность вектора (число элементов) массива

public:

Vector(double *p, int n) // Коструктор на входе массив, задающий вектор

{

this->n = n; // Задаем число элементов

this->p = new double[n]; // Выделяем память

for (int i = 0; i<n; i++) this->p[i] = p[i]; // Копируем один массив в другой

}

void print() // Печать вектора (массива)

{

cout << "\n";

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

cout << p[i] << " ";

}

Vector() { p = 0; n = 0; } // Конструктор без параметров, задает "пустой" объект

double& operator[](int index) // Оператор- функция (перегрузка операции

// обращения к элементу)

{

return p[index];

}

Vector & operator =(Vector& v2) // Оператор- функция копирования объекта

{

n = v2.n;

p = new double[n];

for (int i = 0; i<n; i++) p[i] = v2.p[i];

return *this;

}

~Vector() // Деструктор

{

if (n>0) delete[] p; // Освобождаем память

}

friend Vector & operator *(double x, Vector& v2); // Дружественная функция,

// определенная вне класса

};

// Умножение числа на вектор (первый операнд не объект класса,

// функция обязательно определяется вне класса)

Vector & operator *(double x, Vector& v2) // Оператор- функция вне класса

{

double *p = new double[v2.n]; // Создаем новый массив

for (int i = 0; i<v2.n; i++) p[i] = x*v2.p[i]; // Заполняем массив

Vector *pV = new Vector(p, v2.n); // Создаем новый объект на основе массива

delete[] p; // Освобождаем массив

return *pV; // Возвращаем ссылку на объект

}

int _tmain(int argc, _TCHAR* argv[])

{

double m1[] = { 1, 2, 3, 4.5, 7 };

Vector V1(m1, 5); // Создаем объект

V1.print(); // Печать объекта

cout << "\n";

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

cout << V1[i] << " "; // Пример обращения к операции []

V1[0] = 10.6; // Пример обращения к операции []

V1.print(); // Печать объекта

Vector V2; // Новый объект (вначале "пустой")

V2 = 100 * V1; // Пример выполнение перегруженной операции *

// V2=operator *(100, V1);

V2.print(); // Печать полученного объекта

system("pause"); // Останавливаем программу до нажатия любой клавиши

return 0;

}

// stdafx.h: включаемый файл для стандартных системных включаемых файлов

// или включаемых файлов для конкретного проекта, которые часто используются, но

// не часто изменяются

//

#pragma once

#include "targetver.h"

#include <stdio.h>

#include <tchar.h>

// TODO: Установите здесь ссылки на дополнительные заголовки, требующиеся для программы

#include <stdlib.h>

#include <iostream>

using namespace std;

3.4. Форма отчета по лабораторной работе

Отчет должен содержать: титульный лист, цель работы, условие задачи, текст программы с комментариями, при необходимости ручной расчет контрольного примера и результаты решения контрольного примера программой для проверки правильности работы алгоритма, выводы по работе.

3.5. Вопросы для самоконтроля

1. Способы перегрузки операций в Си++.

2. Перегрузка бинарной операции, когда первый операнд не является объектом класса.

3. Перегрузка операции с помощью дружественной функции класса.

4. Операции, для перегрузки которых оператор- функция обязательно должна принадлежать классу.

4. Лабораторная работа № 4. Изучение возможностей наследования классов

4.1. Цель и задачи работы, требования к результатам ее выполнения

Цель работы состоит в овладении навыками разработки программ на языке Си++, использующих возможности наследования классов для решения различных задач. Для достижения цели необходимо выполнить следующие задачи:

- изучить необходимые учебные материалы, посвященные наследованию классов в языке Си++ [1, 3];

- разработать программу на языке Си++ для решения заданного варианта задания;

- отладить программы;

- представить результаты работы программы;

- подготовить отчет по лабораторной работе.

4.2. Краткая характеристика объекта изучения

4.2.1 Общие сведения о наследовании классов

Основная идея, используемая при наследовании классов, заключается в том, что на основе существующего класса (класс родитель или базовый класс), создается производный класс (класс- наследник, дочерний класс), который включает в себя поля и функции базового класса (наследует их), и содержит дополнительные поля (обладает новыми свойствами) и функции [1, 3].

Примеры определения производных классов:

class S: X, Y, Z

{ ... } ;

class B: public A

{….};

class D: public X, protected B

{….};

4.2.2 Статусы доступа при наследовании классов

Перед именем базового класса может указываться статус доступа наследования (одно из ключевых слов public, protected, private). Статус доступа наследования определяет статус доступа наследуемых полей и функций из базового класса внутри производного класса.

Производный класс может определяться с ключевым словом struct или class (с ключевым словом union производный класс не определяется). Если производный класс определен с ключевым словом class, то по умолчанию статус доступа наследования private.

Если производный класс определен с ключевым словом struct, то по умолчанию статус доступа наследования public.

Статусы доступа при наследовании классов представлены в таблице 1.

Таблица 1- Статусы доступа при наследовании классов