133.03K
Категория: ПрограммированиеПрограммирование

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс

1.

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
ДЗ от 07.06.24
Тема: Шаблоны классов
1
Задача 1. Отработка новых навыков
Реализовать пример кода из видео:
https://www.youtube.com/watch?v=SDRMUgJwro0&t=636s
-------------------------------------------------------------------------------------Задача 2. Закрепление новых навыков
Доработать вышеописанный код из видео:
Дописать реализацию класса «MyClass» таким образом, чтобы в функции
“int main” можно было объявить объект этого класса с набором из четырех аргументов
Пример:
MyClass <int, double, string, bool> c (a, b, c ,d);
где [a,b,c,d] – это наименование переменных с соответствующим типом по порядку.
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

2.

ЯЗЫКИ ПРОГРАММИРОВАНИЯ
2
Шаблоны
Политехнический колледж имени П.А. Овчинникова
Никитин Михаил Евгеньевич, 2015

3.

Введение
3
Шаблоны обеспечивают простой способ введения
разного рода общих концепций и простые
методы их совместного использования.
Шаблоны обеспечивают непосредственную
поддержку обобщенного программирования, то
есть программирования с использованием типов
в качестве параметров.
Политехнический колледж имени П.А. Овчинникова
Никитин Михаил Евгеньевич, 2015

4.

Введение
4
Механизм шаблонов в С++ допускает
использование типа в качестве параметра при
определении класса или функции.
Шаблон зависит только от тех свойств
параметра-типа, которые он явно использует, и
не требует, чтобы различные типы,
используемые в качестве аргументов, были
связаны каким-либо другим образом.
Политехнический колледж имени П.А. Овчинникова
Никитин Михаил Евгеньевич, 2015

5.

Введение
5
Стандартная библиотека должна обеспечивать
большую степень общности, гибкости и
эффективности, чем большинство других
программ.
Каждая существенная абстракция в стандартной
библиотеке представлена в виде шаблона
(например, string, ostream, complex, list и
map), также как и все ключевые операции
(например, сравнение строк, оператор вывода << ,
комплексное сложение, доступ к следующему
элементу списка и сортировка).
Политехнический колледж имени П.А. Овчинникова
Никитин Михаил Евгеньевич, 2015

6.

Простой шаблон строк
6
Строка является классом, который хранит
символы и предоставляет операции, такие как
доступ по индексу, конкатенацию и сравнение,
которые мы обычно ассоциируем с понятием
«строка».
Мы хотели бы реализовать такое поведение для
многих наборов символов.
Политехнический колледж имени П.А. Овчинникова
Никитин Михаил Евгеньевич, 2015

7.

Простой шаблон строк
7
class String {
char* str;
int n;
public:
String(),
String(const char*);
String(const String&);
char read(int i) const;
};
Политехнический колледж имени П.А. Овчинникова
Никитин Михаил Евгеньевич, 2015

8.

Простой шаблон строк
8
А что если надо использовать wchar_t?
А если мы пишем класс для очереди. Для
каждого типов данных исходных элементов
писать свой класс?
Как написать общий класс, который позволил бы
работать с «любыми» типами данных?
Политехнический колледж имени П.А. Овчинникова
Никитин Михаил Евгеньевич, 2015

9.

9
Любой шаблон начинается со слова template,
будь то шаблон функции или шаблон класса.
После ключевого слова template идут угловые
скобки — < >, в которых перечисляется список
параметров шаблона.
Каждому параметру должно предшествовать
зарезервированное слово class или typename.
Политехнический колледж имени П.А. Овчинникова
Никитин Михаил Евгеньевич, 2015

10.

10
Некоторые примеры объявления шаблонов:
template <class T>
template <typename T>
template <typename T1, typename T2>
Политехнический колледж имени П.А. Овчинникова
Никитин Михаил Евгеньевич, 2015

11.

11
Ключевое слово typename говорит о том, что в
шаблоне будет использоваться встроенный тип
данных, такой как: int, double, float, char и т. д.
Ключевое слово class сообщает компилятору, что
в шаблоне функции в качестве параметра будут
использоваться пользовательские типы данных,
то есть классы.
Политехнический колледж имени П.А. Овчинникова
Никитин Михаил Евгеньевич, 2015

12.

Простой шаблон строк
12
template<class Ch> class String{
Ch* str;
int n;
public:
String(),
String(const Ch*);
String(const String&);
Сh read(int i) const;
// ....
};
Политехнический колледж имени П.А. Овчинникова
Никитин Михаил Евгеньевич, 2015

13.

Простой шаблон строк
13
Префикс template<class Ch> указывает, что
объявлен шаблон (template) и что аргумент
Сh будет использован в объявлении как тип.
После объявления Сh используется точно
также, как имена других типов.
Область видимости Сh простирается до конца
объявления, начинающегося с template<class
Сh>. Обратите внимание, что template<class
Сh> означает, что Сh — это имя
пользовательского типа, а не обязательно
имя класса
Политехнический колледж имени П.А. Овчинникова
Никитин Михаил Евгеньевич, 2015

14.

Простой шаблон строк
14
Имя шаблона класса, за которым следует тип,
помещенный в угловые скобки < >, является
именем класса (определяемого шаблоном) и его
можно использовать точно также, как имена
других классов.
Примеры
String<char> cs;
String<unsigned char> us;
String<wchar_t> ws;
class Jchar {
// японские символы
};
String<Jchar> js;
Политехнический колледж имени П.А. Овчинникова
Никитин Михаил Евгеньевич, 2015

15.

Простой шаблон строк
15
За исключением специального синтаксиса своего
имени String<char> работает точно также, как
если бы он был определен как String.
То, что мы сделали String шаблоном, позволит
нам реализовать средства, которые мы ввели для
строк char, для строк с любыми символами.
Политехнический колледж имени П.А. Овчинникова
Никитин Михаил Евгеньевич, 2015

16.

Простой шаблон строк
16
#include <iostream>
#include <map>
using namespace std;
template<class Ch> class String{
// ....
};
int main() // подсчет количества вхождений каждого слова
{
String<char> buf;
map<String<char>, int> m;
while (cin>>buf) m[buf]++;
}
Политехнический колледж имени П.А. Овчинникова
Никитин Михаил Евгеньевич, 2015

17.

Простой шаблон строк
17
#include <iostream>
#include <map>
using namespace std;
template<class Ch> class String{
// ....
};
class Jchar {
// японские символы
};
int main() // подсчет количества вхождений каждого слова
{
String<Jchar> buf;
map<String<Jchar>, int> m;
while (cin>>buf) m[buf]++;
}
Политехнический колледж имени П.А. Овчинникова
Никитин Михаил Евгеньевич, 2015

18.

Простой шаблон строк
18
Стандартная библиотека предоставляет шаблон
класса basic string. В стандартной библиотеке
string определен как синоним
basic_string<char>:
typedef basic_string<char> string;
Политехнический колледж имени П.А. Овчинникова
Никитин Михаил Евгеньевич, 2015

19.

Определение шаблона
19
Класс, генерируемый из шаблона класса,
является совершенно нормальным классом.
Поэтому использование шаблона не
подразумевает каких-либо дополнительных
механизмов времени выполнения сверх тех, что
использовались бы для эквивалентного
написанного «вручную» класса.
Политехнический колледж имени П.А. Овчинникова
Никитин Михаил Евгеньевич, 2015

20.

Определение шаблона
20
Как правило, неплохой идеей является
протестировать конкретный класс, например
String, до преобразования его в шаблон
(String<Ch>).
Поступая таким образом, мы решаем многие
проблемы проектирования и обнаруживаем
большую часть ошибок кода в контексте
конкретного примера.
Политехнический колледж имени П.А. Овчинникова
Никитин Михаил Евгеньевич, 2015

21.

Определение шаблона
21
Члены шаблона класса объявляются и
определяются точно также, как и для обычного
класса.
Член шаблона не обязательно определять внутри
самого шаблона.
Члены шаблона класса в свою очередь являются
шаблонами, параметризованными при помощи
аргументов шаблона.
Политехнический колледж имени П.А. Овчинникова
Никитин Михаил Евгеньевич, 2015

22.

Определение шаблона
22
template<class Ch> class String{
struct Srep;
Srep *rep;
public:
String(),
String(const Ch*);
String(const String&);
Сh read(int i) const;
// ....
};
template <class Сh> String<Сh>::String()
{
str = new Сh();
n = 0;
}
Политехнический колледж имени П.А. Овчинникова
Никитин Михаил Евгеньевич, 2015

23.

Определение шаблона
23
template<class Ch> class String{
Ch* str;
int n;
public:
String();
friend istream& operator>> <Ch>(istream& io, String<Ch>& str);
friend ostream& operator<< <Ch>(ostream& io, String<Ch>& str);
// ....
};
template<class Ch> istream& operator>>(istream& io, String<Ch>& _str)
{
io >> _str.str;
return io;
}
template<class Ch> ostream& operator<<(ostream& io, String<Ch>& _str)
{
io << _str.str;
return io;
}
Политехнический колледж имени П.А. Овчинникова
Никитин Михаил Евгеньевич, 2015

24.

Инстанцирование
24
Процесс генерации объявления класса по
шаблону класса и аргументу шаблона часто
называется инсшанцированием шаблона
(template instantiation)
Аналогично, функция генерируется
(«инстанцируется») из шаблона функции и
аргумента шаблона.
Версия шаблона для конкретного аргумента
шаблона называется специализацией.
Политехнический колледж имени П.А. Овчинникова
Никитин Михаил Евгеньевич, 2015

25.

Инстанцирование
25
Генерация версий функций шаблона для набора
аргументов шаблона является задачей компилятора,
а не программиста.
String<char> cs;
void f()
{
String<Jchar> js;
cs = "Какой код сгенерировать, решает
компилятор";
}
Политехнический колледж имени П.А. Овчинникова
Никитин Михаил Евгеньевич, 2015

26.

26
В этом случае компилятор генерирует
объявления для String<char> и
String<Jchar>, для их соответствующих типов,
для их деструкторов и конструкторов по
умолчанию и для присваивания
String<char>::operator= (char*) и т.д.
Политехнический колледж имени П.А. Овчинникова
Никитин Михаил Евгеньевич, 2015

27.

27
Сгенерированные классы являются совершенно
обычными классами, которые подчиняются всем
стандартным правилам для классов.
Аналогично, сгенерированные функции
являются обычными функциями, которые
подчиняются всем стандартным правилам для
функций.
Политехнический колледж имени П.А. Овчинникова
Никитин Михаил Евгеньевич, 2015
English     Русский Правила