Слайд 2Шаблоны. Родовые функции
Шаблоны. Родовые классы.
Потоки ввода-вывода.
Файловые потоки ввода-вывода.
Шаблоны. Потоки ввода-вывода
Слайд 3Шаблоны
С помощью шаблонов можно создавать родовые функции и родовые классы.
В шаблонах
тип обрабатываемых данных задается как параметр (заранее не известен). Это позволяет использовать одну и ту же функцию или класс с разными типами данных.
Слайд 4Шаблоны. Родовые функции
Родовые функции определяют базовый набор операций, которые будут применяться
к разным типам данных.
При вызове родовая функция будет работать с тем типом данных, который она получит как параметр.
Родовая функция позволяет определить сущность некоторого алгоритма обработки данных без привязки к конкретному типу данных.
Слайд 5Шаблоны. Родовые функции
Родовая функция создается с помощью ключевого слова template и
называется шаблоном функции.
Формат определения шаблона:
template
тип_возвр_знач имя_функции (список_парам)
{ тело_функции }
T – это фиктивное имя типа данных (родовый тип данных), который компилятор автоматически заменяет именем реального типа данных при создании конкретного варианта функции.
Слайд 6template void Swap(T& a, T& b) {
T t;
t = a; a = b; b = t;
}
Слайд 7template void Swap(T& a, T& b) {
T t;
t = a; a = b; b = t;
}
int main() {
int i = 10, j = 20;
float x = 10.1, y = 20.2;
cout << "Before swap:" << endl;
cout << "i = " << i << ", j = " << j << endl;
cout << "x = " << x << ", y = " << y << endl;
cout << endl;
Swap(i, j);
Swap(x, y);
cout << "After swap:" << endl;
cout << "i = " << i << ", j = " << j << endl;
cout << "x = " << x << ", y = " << y << endl;
return 0;
}
Слайд 8template void Swap(T& a, T& b) {
T t;
t = a; a = b; b = t;
}
Слайд 9Шаблоны. Родовые функции
Вместо ключевого слова class можно использовать typename.
Можно использовать несколько
родовых типов данных:
template
тип_возвр_знач имя_функции (список_парам)
{ тело_функции }
Родовые функции похожи на перегруженные функции. Но при перегрузке функций можно написать разные алгоритмы, а родовая функция определяет общий алгоритм.
Слайд 10Шаблоны. Родовые функции
template
void print(T1 x, T2 y)
{
cout << x << ' ' << y << endl;
}
int main() {
print(10, "hi");
print(0.2, 0x10000);
print('a', 1.5);
print(12, 5);
return 0;
}
Слайд 11Шаблоны. Родовые классы
Родовые классы содержат общую логику хранения и обработки данных,
которую можно применять к объектам разного типа.
Формат объявления шаблона класса:
template
class имя_класса {
тело_класса
};
T – имя фиктивного типа данных. Конкретный тип будет определен при создании объекта класса.
Слайд 12Шаблоны. Родовые классы
Определение функций класса вне шаблона:
template
тип_возвр_знач имя_класса
:: имя_функции (список_парам) {тело_функции }
Функции-элементы родового класса автоматически становятся родовыми функциями.
Создание объекта класса на основе шаблона:
имя_класса <тип_данных> имя_объекта;
Слайд 13template
class List {
T data;
List* next;
public:
List(T d);
void add(List* node) {
node -> next = this;
next = 0;
}
List* getNext() { return next; }
T getData() { return data; }
};
template
List::List(T d) {
data = d;
next = 0;
}
Слайд 14int main() {
List start('a');
List *p, *last;
last = &start;
for(int i = 1; i < 26; i++) {
p = new List ('a'+i);
p -> add(last);
last = p;
}
p = &start;
while(p) {
cout << p -> getData();
p = p -> getNext();
}
cout << endl;
return 0;
}
Слайд 16class Point {
float x, y;
public:
Point(float x = 0.0, float
y = 0.0) {
this -> x = x;
this -> y = y;
}
friend ostream& operator<< (ostream& out, Point& p);
};
ostream& operator<< (ostream& out, Point& p) {
out << '[' << p.x << ',' << p.y << ']' << endl;
return out;
}
Слайд 17int main() {
List start(Point(0, 0));
List *p, *last;
last =
&start;
for(int i = 1; i < 26; i++) {
p = new List
(Point(i/2.0, i));
p -> add(last);
last = p;
}
p = &start;
while(p) {
cout << p -> getData();
p = p -> getNext();
}
cout << endl;
return 0;
}
Слайд 19Потоки ввода-вывода
В C++ имеется набор классов для управления вводом-выводом, использующий механизм
перегрузки операций.
Классы потоков:
ios – базовый класс ввода-вывода;
istream и ostream – потоки ввода и вывода соответственно, производные от ios;
iostream – комбинированный класс для ввода и вывода, производный от istream и ostream;
ifstream, ofstream, fstream – классы для управления файловым вводом-выводом.
Слайд 20Потоки ввода-вывода
Предопределенные объекты-потоки:
Слайд 21class Point {
float x, y;
public:
Point(float x = 0.0, float
y = 0.0) {
this -> x = x;
this -> y = y;
}
friend ostream& operator << (ostream& out, Point& p);
friend istream& operator >> (istream& in, Point& p);
};
ostream& operator << (ostream& out, Point& p) {
out << '[' << p.x << ',' << p.y << ']' << endl;
return out;
}
istream& operator >> (istream& in, Point& p) {
in >> p.x >> p.y;
return in;
}
Слайд 22int main() {
Point p;
cout > p;
cout
<< "The point: " << p;
return 0;
}
Слайд 23istream& operator >> (istream& in, Point& p) {
char c;
in
>> c;
if(c != '[') return in;
in >> p.x;
in >> c;
if(c != ',') return in;
in >> p.y;
in >> c;
return in;
}
Слайд 24Файловые потоки ввода-вывода
ifstream, ofstream, fstream – классы для управления файловым вводом-выводом.
Чтобы
работать с файловым потоком, нужен объект потока и открытый файл, связанный с ним.
Для закрытия файла нужно вызвать метод close() для объекта потока.
Деструктор потока автоматически закрывает файл при уничтожении объекта потока.
Слайд 25Конструирование объекта потока
Конструктор, создающий объект без открытия файла:
ifstream(); ofstream(); fstream();
Конструктор, открывающий указанный файл
и связывающий его с потоком:
ifstream(const char* name,
int mode = ios::in,
long prot = 0666);
Конструктор, создающий объект и связывающий его с открытым файлом:
ifstream(int file);
Конструктор, создающий объект и связывающий его с открытым файлом и буфером:
ifstream(int file, char* buf, int len);
Слайд 26Конструирование объекта потока
Режимы открытия файла (параметр mode):
ifstream(const char* name, int mode,
long prot);
Значения параметра определены в классе ios:
Параметры можно комбинировать с помощью поразрядного «ИЛИ»
Слайд 27#include
#include
using namespace std;
class Point {
float x, y;
public:
Point(float
x = 0.0, float y = 0.0);
friend ostream& operator << (ostream& out, Point& p);
friend istream& operator >> (istream& in, Point& p);
friend ofstream& operator << (ofstream& out, Point& p);
friend ifstream& operator >> (ifstream& in, Point& p);
};
Слайд 28ofstream& operator
<< p.x << ',' << p.y << ']' << endl;
return out;
}
ifstream& operator >> (ifstream& in, Point& p) {
char c;
in >> c;
if(c != '[') return in;
in >> p.x;
in >> c;
if(c != ',') return in;
in >> p.y;
in >> c;
return in;
}
Слайд 29int main() {
Point p;
cout
cin >> p;
char fileName[] = "points.txt";
fstream fs(fileName, ios::app|ios::binary);
fs << p;
fs.close();
fs.open(fileName, ios::in|ios::binary);
while(fs) {
fs >> p;
if(fs) cout << "The point: " << p;
}
fs.close();
return 0;
}