kopilkaurokov.ru - сайт для учителей

Создайте Ваш сайт учителя Курсы ПК и ППК Видеоуроки Олимпиады Вебинары для учителей

Деструктор. полиморфизм. параметрический полиморфизм

Нажмите, чтобы узнать подробности

Деструктор. Полиморфизм. Параметрический полиморфизм

Вы уже знаете о суперспособностях современного учителя?
Тратить минимум сил на подготовку и проведение уроков.
Быстро и объективно проверять знания учащихся.
Сделать изучение нового материала максимально понятным.
Избавить себя от подбора заданий и их проверки после уроков.
Наладить дисциплину на своих уроках.
Получить возможность работать творчески.

Просмотр содержимого документа
«Деструктор. полиморфизм. параметрический полиморфизм»

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ

ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ

ВЫСШЕГО ОБРАЗОВАНИЯ

«МОРДОВСКИЙ ГОСУДАРСТВЕННЫЙ ПЕДАГОГИЧЕСКИЙ ИНСТИТУТ

ИМЕНИ М. Е. ЕВСЕВЬЕВА»




Физико-математический факультет


Кафедра информатики и вычислительной техники





РЕФЕРАТ


ДЕСТРУКТОР. ПОЛИМОРФИЗМ. ПАРАМЕТРИЧЕСКИЙ ПОЛИМОРФИЗМ





Выполнил:

студент группы МДИ-117

Осипов В. В.



Введение

Объектное и объектно-ориентированное программирование (ООП) возникло в результате развития идеологии процедурного программирования, где данные и подпрограммы (процедуры, функции) их обработки формально не связаны. Кроме того, в современном объектно-ориентированном программировании часто большое значение имеют понятия события (так называемое событийно-ориентированное программирование) и компонента (компонентное программирование).

Первым языком программирования, в котором были предложены принципы объектной ориентированности, была Симула. В момент своего появления (в 1967 году), этот язык программирования предложил поистине революционные идеи: объекты, классы, виртуальные методы и др., однако это всё не было воспринято современниками как нечто грандиозное. Тем не менее, большинство концепций были развиты Аланом Кэйем и Дэном Ингаллсом в языке Smalltalk. Именно он стал первым широко распространённым объектно-ориентированным языком программирования.

В настоящее время количество прикладных языков программирования (список языков), реализующих объектно-ориентированную парадигму, является наибольшим по отношению к другим парадигмам. В области системного программирования до сих пор применяется парадигма процедурного программирования, и общепринятым языком программирования является язык C. Хотя при взаимодействии системного и прикладного уровней операционных систем заметное влияние стали оказывать языки объектно-ориентированного программирования. Например, одной из наиболее распространенных библиотек мультиплатформенного программирования является объектно-ориентированная библиотека Qt, написанная на языке C++.


Деструкторы классов

инициализация программа конструктор деструкция

Для выполнения действий, обратных совершаемым конструкторами, т.е., например, освобождение заказанной памяти, закрытие открытых конструктором файлов и т.п., в С++ введен механизм деструкторов. Деструктор класса вызывается автоматически для каждого из объектов класса при потере его из области видимости в программе. Это происходит при выходе программы из блока, в котором определен объект класса. Существование блока легко определяется по фигурным скобкам, открывающим и закрывающим каждый из блоков. Если объект класса определен глобально, например, перед функцией main(), деструктор для этого объекта будет вызван в самом конце программы.

Если для класса X конструктор класса называется X, то его деструктор называется ~X.

Чаще всего конструкторы и деструкторы классов используют стандартные операции С++ для заказа и освобождения динамически распределяемой оперативной памяти, соответственно new и delete.

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

Каждая из созданных до сих пор программ создавала объекты в самом начале своего выполнения, просто объявляя их. При завершении программ C++ уничтожал объекты. Если вы определяете деструктор внутри своей программы, C++ будет автоматически вызывать деструктор для каждого объекта, когда программа завершается (т.е. когда объекты уничтожаются). Подобно конструктору, деструктор имеет такое же имя, как и класс объекта.

Деструктор представляет собой функцию, которую C++ автоматически запускает, когда он или ваша программа уничтожает объект. Деструктор имеет такое же имя, как и класс объекта; однако вы предваряете имя деструктора символом тильды (~), например ~employee. В своей программе вы определяете деструктор точно так же, как и любой другой метод класса.

В качестве примера рассмотрим некоторый класс String:

#include "iostream.h"

#include "string.h"String {*QuoteString;StringLength;:( char * ); // Конструктор

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

};::String ( char *InitString )

{= new char[strlen(InitString)+1];(QuoteString, InitString);(!QuoteString)Недостаточно памяти!";= strlen(QuoteString);

}::~String( ) // Освобождение памяти

{Строка" Освобождена\n";

}

void main( )

{

String First("Первая строка"); // Вызов конструктора First

{

String Second("Вторая строка"); // Вызов конструктора

// для Second

// Операторы программы

} // Вызов деструктора

// для Second

// Операторы программы

} // Вызов деструктора

// для First


Результатом работы этой программы будет следующее сообщение:

СтрокаПервая строкаОсвобождена

СтрокаВторая строкаОсвобождена


. Пpимеp программы с конструкторами и деструкторами


Продолжим выполнение задания из примера предыдущей главы для объектов класса "Комплексные числа" в части программирования конструкторов и деструкторов:


/*********************/

/* Constructors & */

/* Destructors of */

/* class Complex */

/*********************/

/* v.25.12.2002 */

#include "iostream.h" // Для cin, cout см.последующие главы

class Complex {

float Re; // Действительная иIm; // мнимая части числа

public:

Complex ( );( int, int );

~Complex ( );

// Функции арифметики

void Put ( ); // Функция ввода

};

void Complex::Put ( ) // Вывод на экран

{

}::Complex(int R, int I)

{= R; Im = I;

}::Complex( )

{= Im = 0;

}::~Complex( )

{= 0; Im = 0;

}main( )

{

{

Complex a,b; // Определение объектов a,b

Complex c(12,24); // Определение объекта c.Put( ), b.Put( ),c.Put ( ); // Вывод на экран

}

}



Полиморфизм

Полиморфизм – свойство, которое позволяет использовать одно и тоже имя функции для решения двух и более схожих, но технически разных задач. Полиморфизм – возможность замещения методов объекта родителя методами объекта-потомка, имеющих то же имя.

Полиморфизм по-гречески означает «много форм». Объекты, имеющие общего предка, могут принимать разные формы, оставаясь при этом схожими.

Чтобы использовать полиморфизм, необходимо чтобы:

1) все классы-потомки являлись наследниками одного и того же базового класса

2) функция, реализующая метод, должна быть объявлена виртуальной в базовом классе

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

  1. Полиморфизм позволяет использовать одно и то же имя функции для решения двух и более схожих, но технически разных задач.

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

  3. Чтобы сделать базовый класс абстрактным, достаточно ввести в класс хотя бы одну чисто виртуальную функцию.

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


Доступ к обычным методам через указатели

Рассмотрим пример, когда базовый и производные классы содержат функции с одни и тем же именем, и к ним обращаются с помощью указателей, но без использования виртуальных функций:

A, B, Base – это типы. Указатели на объекты производных классов совместимы по типу с указателями на объекты базового класса.

Base *ptr; ptr=&a; ptr=&b;

Однако, указатели производных классов между собой не совместимы!

Пример:

A *ptr; ptr=&a;

ptr=&b; // указатель класса A не совместим с указателем класса B!!!

Теперь необходимо понять, какая собственно функция выполняется в этой строчке

Это функция Base::show() или A::show() или B:show()?



Параметрический полиморфизм


Шаблоны функций

Шаблоны, которые называют иногда родовыми или параметризованными типами, позволяют создавать (конструировать) семейства родственных функций и классов.

Цель введения шаблонов функций – автоматизация создания функций, которые могут обрабатывать разнотипные данные. В отличие от механизма перегрузки, когда для каждого набора формальных параметров определяется своя функция, шаблон семейства функций определяется один раз, но это определение параметризуется. Параметризовать в шаблоне функций можно тип возвращаемого функцией значения и типы любых параметров, количество и порядок размещения которых должны быть фиксированы. Для параметризации используется список параметров шаблона.

В определении шаблона семейства функций используется служебное слово template. Для параметризации используется список формальных параметров шаблона, который заключает­ся в угловые скобки . Каждый формальный параметр шаблона обозначается служебным словом class, за которым следует имя параметра (идентификатор). Пример определения шаблона функций, вычисляющих абсолютные значения числовых величин разных типов:

template class type
type abs (type x) { if(x0) return(x); else return(-x);}

Шаблон семейства функций состоит из двух частей – заголовка шаблона:

template

и тела определения функции. В списке параметров шаблона слово class может относиться как к базовому, так и к абстрактному типу данных. Таким образом, список параметров шаблона  просто означает, что Т представляет собой тип, который будет задан позднее. Так как Т является параметром, обозначающим тип, шаблоны иногда называют параметризованными типами.

В качестве другого примера рассмотрим шаблон семейства функций для обмена значений двух передаваемых им параметров:

template class T
void swap (T* x, T* y) {

  T z = *x;

  *x = *y;

  *y = z;

}

Здесь параметр T шаблона функций используется не только в заголовке для спецификации формальных параметров, но и в теле определения функции, где он задает тип вспомогатель­ной переменной z.

Шаблон семейства функций служит для автоматического формирования конкретных определений функций по тем вызовам, которые транслятор обнаруживает в теле программы. Например, если программист употребляет обращение

cout

то на основе приведенного ранее шаблона компилятор сформирует следующее определение функции:

double abs (double x) { if(x0) return(x); else return(-x);}

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

Если в программе присутствует приведенный ранее шаблон семейства функций swap() и имеет место, скажем, следующий вызов этой функции:

long int k = 4, d = 8;
swap (&k, &d);

то компилятор сформирует определение функции:

void swap (long int *x, long int *y) {

  long int z = *x;

  *x = *y;

  *y = z;
}

Затем будет выполнено обращение именно к этой функции и значения переменных k, d  поменяются местами. Если в той же программе присутствуют операторы:

double a = 2.44, b = 66.3;
swap (&a, &b);

то сформируется и выполнится функция

void swap (double *x, double *y) {

  double z = *x;

  *x = *y;

  *y = z;

}

Пример Рассмотрим программу, используя некоторые возможности функций,  возвращающих значение типа «ссылка». Но тип ссылки будет определяться параметром шаблона:

#include 
using namespace std;
//Функция возвращает ссылку на элемент с максимальным значением
template class type
type& rmax (int n, type *d) {

  int im = 0;

  for (int i = 1; i

    if(d[im]

      im = i;

  return d[im];

}
int main() {
//Массив целых чисел

  int n = 4;

  int x[] = { 10, 20, 30, 14};

  cout // rmax(n,x) = 30

  for (int i = 0; i

  cout »   x[« «] =» 

  rmax(n,x) = 0;                    // обнулить максимальный элемент

  cout

  for (int i = 0; i

  cout »   x[« «] =»  //Массив вещественных чисел

  int m = 3;

  float arx[] = { 10.3, 20.4, 10.5};

  cout «rmax(m,arx) = « 

  for (int i = 0; i

  cout »   arx[« «] =» 

  rmax(m, arx) = 0;                // обнулить максимальный элемент

  cout

  for (int i = 0; i

  cout »   arx[« «] =» 

  cin.get();

  return 0;
}

Результат выполнения


В примере используются два разных обращения к функции rmax(). В одном случае параметр – целочисленный массив и возвращаемое значение – ссылка типа int. Во втором случае фактический параметр – имя массива типа float и возвращаемое значение имеет тип ссылки на float.

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

Параметры шаблонов

Параметры шаблона являются его формальными аргументами, а типы тех аргументов, которые используются в конкретных обращениях к функции, служат фактическими аргументами шаблона. По ним выполняется параметрическая настройка и с учетом этих типов генерируется конкретный текст определения функции. Говоря о шаблоне семейства функций, обычно имеют в виду формальные аргументы (параметры) шаблона.
Перечислим основные свойства параметров шаблона:

  • Имена параметров шаблона должны быть уникальными во всем определении шаблона.

  •  Список параметров шаблона функции не может быть пустым, так как при этом теряется возможность параметризации, и шаблон функций становится обычным определением конкретной функции.

  •  В списке параметров шаблона функций может быть несколько параметров. Каждый из них должен начинаться со служебного слова class. Например, допустим такой заголо-вок шаблона:

template 

Соответственно, неверен заголовок:

template 

  • Недопустимо использовать в заголовке шаблона параметры с одинаковыми именами, то есть ошибочен такой заголовок:

template 

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




Заключение

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

Современный объектно-ориентированный язык предлагает, как правило, следующий обязательный набор синтаксических средств:

* Объявление классов с полями (данными - членами класса) и методами (функциями - членами класса).

* Механизм расширения класса (наследования) - порождение нового класса от существующего с автоматическим включением всех особенностей реализации класса-предка в состав класса-потомка. Большинство ООП-языков поддерживают только единичное наследование.

* Средства защиты внутренней структуры классов от несанкционированного использования извне. Обычно это модификаторы доступа к полям и методам, типа public, private, обычно также protected, иногда некоторые другие.

* Полиморфные переменные и параметры функций (методов), позволяющие присваивать одной и той же переменной экземпляры различных классов.

* Полиморфное поведение экземпляров классов за счёт использования виртуальных методов. В некоторых ООП-языках все методы классов являются виртуальными.

Практически все объектно-ориентированные языки программирования являются развивающимися языками, их стандарты регулярно уточняются и расширяются. Следствием этого развития являются неизбежные различия во входных языках компиляторов различных систем программирования. Наиболее распространенными в настоящее время являются системы программирования Microsoft C++ , Microsoft Visual C++ и системы программирования фирмы Borland International.



Список источников

 

1.            Гуськова, О. И. Объектно ориентированное программирование в Java : учебное пособие / О. И. Гуськова ; Московский педагогический государственный университет. – Москва : Московский педагогический государственный университет (МПГУ), 2018. – 240 с. – URL: https://biblioclub.ru/index.php?page=book&id=500355 (дата обращения: 11.11.2020). – ISBN 978-5-4263-0648-6. – Текст : электронный.

2.            Зыков, С. В.  Программирование. Объектно-ориентированный подход : учебник и практикум для вузов / С. В. Зыков. – Москва : Издательство Юрайт, 2020. – 155 с. – (Высшее образование). – ISBN 978-5-534-00850-0. – Текст : электронный // ЭБС Юрайт [сайт]. – URL: https://urait.ru/bcode/451488 (дата обращения: 11.11.2020).

3.            Казанский, А. А.  Объектно-ориентированный анализ и программирование на Visual Basic 2013 : учебник для вузов / А. А. Казанский. – Москва : Издательство Юрайт, 2020. – 290 с. – (Высшее образование). – ISBN 978-5-534-01122-7. – Текст : электронный // ЭБС Юрайт [сайт]. – URL: https://urait.ru/bcode/451412 (дата обращения: 11.11.2020).

4.            Карпенко, С. Н. Основы объектно-ориентированного программирования на языке С++ : учебно-методическое пособие / С. Н. Карпенко. – Нижний Новгород : ННГУ им. Н. И. Лобачевского, 2018. – 104 с. – Текст : электронный // Лань : электронно-библиотечная система. – URL: https://e.lanbook.com/book/144808 (дата обращения: 11.11.2020). – Режим доступа: для авториз. пользователей.

5.            Николаев, Е. И. Объектно-ориентированное программирование : учебное пособие / Е. И. Николаев ; Северо-Кавказский федеральный университет. – Ставрополь : Северо-Кавказский Федеральный университет (СКФУ), 2015. – 225 с. – URL: https://biblioclub.ru/index.php?page=book&id=458133 (дата обращения: 11.11.2020). – Библиогр. в кн. – Текст : электронный.

6.            Объектно-ориентированное программирование в научных исследованиях: практикум / авт.-сост. В. П. Герасимов, В. Д. Ковалев ; Министерство науки и высшего образования Российской Федерации, Северо-Кавказский федеральный университет. – Ставрополь : Северо-Кавказский Федеральный университет (СКФУ), 2018. – 119 с. – URL: https://biblioclub.ru/index.php?page=book&id=563230 (дата обращения: 11.11.2020). – Текст : электронный.

7.            Тузовский, А. Ф.  Объектно-ориентированное программирование : учебное пособие для вузов / А. Ф. Тузовский. – Москва : Издательство Юрайт, 2020. – 206 с. – (Высшее образование). – ISBN 978-5-534-00849-4. – Текст : электронный // ЭБС Юрайт [сайт]. – URL: https://urait.ru/bcode/451429 (дата обращения: 11.11.2020).

8.            Черпаков, И. В.  Основы программирования : учебник и практикум для среднего профессионального образования / И. В. Черпаков. – Москва : Издательство Юрайт, 2020. – 219 с. – (Профессиональное образование). – ISBN 978-5-9916-9984-6. – Текст : электронный // ЭБС Юрайт [сайт]. – URL: https://urait.ru/bcode/452182 (дата обращения: 11.11.2020).






Получите в подарок сайт учителя

Предмет: Информатика

Категория: Уроки

Целевая аудитория: Прочее.
Урок соответствует ФГОС

Скачать
Деструктор. полиморфизм. параметрический полиморфизм

Автор: Осипов Владимир Вячеславович

Дата: 10.01.2022

Номер свидетельства: 597259

Похожие файлы

object(ArrayObject)#852 (1) {
  ["storage":"ArrayObject":private] => array(6) {
    ["title"] => string(99) "Деструктор. полиморфизм. параметрический полиморфизм"
    ["seo_title"] => string(53) "destruktor_polimorfizm_parametricheskii_polimorfizm_2"
    ["file_id"] => string(6) "597258"
    ["category_seo"] => string(11) "informatika"
    ["subcategory_seo"] => string(11) "presentacii"
    ["date"] => string(10) "1641839146"
  }
}
object(ArrayObject)#874 (1) {
  ["storage":"ArrayObject":private] => array(6) {
    ["title"] => string(99) "Деструктор. полиморфизм. параметрический полиморфизм"
    ["seo_title"] => string(51) "destruktor_polimorfizm_parametricheskii_polimorfizm"
    ["file_id"] => string(6) "596654"
    ["category_seo"] => string(11) "informatika"
    ["subcategory_seo"] => string(7) "prochee"
    ["date"] => string(10) "1640908406"
  }
}
object(ArrayObject)#852 (1) {
  ["storage":"ArrayObject":private] => array(6) {
    ["title"] => string(99) "Деструктор. полиморфизм. параметрический полиморфизм"
    ["seo_title"] => string(53) "destruktor_polimorfizm_parametricheskii_polimorfizm_1"
    ["file_id"] => string(6) "596655"
    ["category_seo"] => string(11) "informatika"
    ["subcategory_seo"] => string(11) "presentacii"
    ["date"] => string(10) "1640908474"
  }
}


Получите в подарок сайт учителя

Видеоуроки для учителей

Курсы для учителей

ПОЛУЧИТЕ СВИДЕТЕЛЬСТВО МГНОВЕННО

Добавить свою работу

* Свидетельство о публикации выдается БЕСПЛАТНО, СРАЗУ же после добавления Вами Вашей работы на сайт

Удобный поиск материалов для учителей

Ваш личный кабинет
Проверка свидетельства