Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Язык программирования Сpp 25.09.11 (2).doc
Скачиваний:
16
Добавлен:
19.08.2019
Размер:
10.09 Mб
Скачать

Указатель классов

Иногда приходится создавать динамические массивы элементами которых являются объекты некого класса. Вкачестве примера рассмотрим класс Book

#include<iostream.h>

#include<windows.h>

#include<string.h>

class Book{

public:

void show_title();

void show_book();

Book(char *title,char *author,char *publisher, float price);

~Book();

private:

char title[256];

char author[64];

float price;

char publisher[256];

void show_publisher();

};

int main(int argc,char* argv[]){

SetConsoleOutputCP(1251);

SetConsoleCP(1251);

Book *library[5];

library[0]=new Book("Война и мир","Толстой","Советская литература", 3);

library[1]=new Book("Java в примерах","Флэнаган","Символ", 500);

library[2]=new Book("C/C++","Шилдт","Вильямс", 150);

library[3]=new Book("Техническая диагностика","Глущенко","Вузовская книга", 200);

library[4]=new Book("Язык СИ++","Подбельский","Финансы и статистика", 130);

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

library[i]->show_book();

/*Удаление одного экземпляра для освобождения динамической памяти*/

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

delete library[i];

return 0;}

Book::Book(char *title,char *author,char *publisher, float price){

strcpy(Book::title,title);

strcpy(Book::author,author);

strcpy(Book::publisher,publisher);

Book::price=price;

}

void Book::show_title(){

cout<<title<<" "<<author<<endl;

}

void Book::show_book(){

show_title(); show_publisher();}

Book::~Book(){

cout<<"Разрушенте объекта"<<endl;}

void Book::show_publisher(){

cout<<publisher<<endl;}

Шаблоны

Перед тем как рассказать что то о шаблонах рассмотрим простую функцию, которая меняет значение двух переменных между собой. Например, если до обращения к программе переменная x=1, а y=0, то после обращения, наоборот x=0, а y=1. Код такой функции можно записать так:

void Swap (int& x, int& y)

{

int temp;

temp=x;

x=y;

y=temp;

}

Обратим внимание на то, что этот алгоритм применим не только к переменным типа int но и к переменным любого типа. Поэтому тот же алгоритм для переменных типа char будет выглядеть так

void Swap (char& x, char& y)

{

char temp;

temp=x;

x=y;

y=temp;

}

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

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

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

Объявление шаблона функции выглядит так:

template <typename имя_типа> тип_результата имя_функции (список параметров)

{

//Тело функции

}

или так

template <class имя_типа> тип_результата имя_функции (список параметров)

{

//Тело функции

}

Cтрока template <class тип> называется префиксом шаблона. Слово template в переводе на русский означает шаблон. Далее идет слово class, которое в данном случае читается как тип. Согласно стандарту ANSI C++ в префиксе шаблона вместо слова class можно применять ключевое слово typename. Иначе говоря, слово class вовсе не означает, что шаблоном является класс. Далее идет, так называемый, параметр типа. Параметр типа это любой идентификатор означающий тип. Параметр типа можно рассматривать как имя обобщенного (любого) типа. В частности для рассмотренных выше примеров где использовались типы int и char можно использовать, например, имя inch или chin, т.е. любое имя разрешенное в С++.

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

#include <iostream>

using namespace std;

#include <windows.h>

template <class T> // Параметр типа обозначен через Т

/* Далее идет описание функции в котором тип задан параметром T. Передача параметра, в данном случае, осуществляется по ссылке */