Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Razdatochnye_materialy_chast_2

.pdf
Скачиваний:
4
Добавлен:
16.03.2015
Размер:
206.75 Кб
Скачать

41

Конструкторы и деструкторы

Пример - конструктор и

 

 

деструктор класса

 

stack::stack()

stack:

 

{

class stack{

 

 

tos=0;

char stk[SIZE];

 

 

}

int tos;

 

 

 

public:

 

stack::~stack()

stack();

 

 

{

~stack();

 

 

printf(“%d elements left in

int push(char);

 

 

stack”, tos);

int pop(char&);

 

}

};

 

 

 

 

 

42

Конструктор с параметрами

class stack{

 

 

stack::stack(int s=SIZE)

 

char* stk;

 

 

{

 

int size;

 

 

 

 

 

stk=new char[ size=(s>0)?s:1 ];

 

int tos;

 

 

 

 

 

if( stk == NULL ) size=0;

 

public:

 

 

 

 

 

 

 

stack(int);

 

 

tos=0;

 

~stack();

 

 

}

 

int push(char);

 

 

stack::~stack()

 

int pop(char&);

 

 

 

 

 

{

 

};

 

 

 

 

 

delete[] stk;

 

 

 

 

 

 

 

 

}

 

 

 

 

Передача параметров в конструктор:

stack s(50), s2(1000),s3;

 

 

 

 

 

 

 

 

 

43

Перегрузка методов класса

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

Перегрузка операций в классе

тип& operator<знак>(параметры)

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

44

Пример перегрузки операции =

class stack{

 

stack& stack::operator=(stack& arg)

char* stk;

 

{

int size;

 

if( &arg == this ) return *this;

int tos;

 

if( stk != NULL ) delete[] stk;

public:

 

if( arg.stk != NULL ) {

stack(int);

 

stk=new char[ size=arg.size ];

~stack();

 

tos=arg.tos;

int push(char);

 

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

int pop(char&);

 

stk[ i ] = arg.stk[ i ];

stack& operator=(stack&);

 

}

};

 

else { stk=NULL; size=0; }

 

 

return *this;

 

 

}

 

 

 

45

Консольный ввод-вывод в С++

#include <iostream>

using namespace std;

cout<<выражение; cin>>переменная;

Перегруженные операции >> и << возвращают cout и cin соответственно, и выполняются слева направо.

46

Файловый ввод-вывод в С++

#include <fstream> using namespace std;

ifstream – класс входных файловых потоков

ofstream – класс выходных файловых потоков

fstream – класс двунаправленных файловых потоков

47

Файловый ввод-вывод в С++

Конструкторы с параметрами: ifstream(const char* name, int mode=ios::in);

ofstream(const char* name, int mode=ios::out|ios::trunc); fstream(const char* name, int mode=ios::in|ios::out);

Есть конструкторы без параметров.

Методы:

open(…), close(), eof()

Перегруженные операции: >> и << соответственно.

48

Класс string

#include <string> using namespace std;

Перегруженные операции:

= + += == != <= >=

Некоторые методы:

find insert remove substr empty

49

Шаблон vector

#include <vector> using namespace std;

Определение класса по шаблону: vector<class> имя(размер);

Примеры:

vector<int> a; // пустой вектор целых vector<stack> s(10); // начальный размер 10

50

Шаблон vector

Некоторые методы: size – текущий размер

capacity – текущая ёмкость resize – изменение размера reserve – изменение ёмкости

push_back – добавить элемент в конец pop_back – удалить элемент с конца

51

Инициализация массивов объектов

класс имя[размер]={класс(параметры), класс(параметры), …};

Пример:

stack st[3]={stack(10), stack(20), stack(30)};

Для конструктора с одним параметром есть сокращённая форма:

stack st[3]={10, 20, 30};

52

Конструктор копирования

имя_класса(имя_класса& ) Вызывается в трёх случаях:

При передаче объекта в функцию в качестве параметра

При возврате объекта из функции, как возвращаемого значения

При определении нового объекта, как копии существующего

53

Пример конструктора копирования

stack::stack(stack& arg)

{

if(stk != NULL) delete[] stk;

if( arg.stk != NULL ) {

stk=new char[size=arg.size];

tos=arg.tos;

for( int i=0; i<tos; i++ ) stk[ i ] = arg.stk[ i ]; else { stk=NULL; size=0; }

}

54

Статические элементы класса

Определяются с помощью ключевого слова static

Они общие для всех объектов данного класса

Создаются при определении класса, и существуют, даже если нет объектов данного класса

Не учитываются операцией sizeof()

Обращаться к ним можно и через имя объекта, и через имя класса

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

В закрытой части класса обращаться к статическим полям могут только статические методы

55

Дружественные функции и дружественные классы

Определяются в классе с помощью ключевого слова friend. Дружественные классу функции, не являющиеся членами класса, тем не менее имеют доступ к закрытой части класса. Все методы дружественного класса имеют доступ к закрытой части класса.

Дружественность не взаимна и не наследуется.

56

Объекты внутри объектов

Для передачи параметров конструкторам объектов, являющих полями главного объекта, конструктор главного объекта должен быть определён так:

имя_класса(параметры_1): имя_поля(параметры_2)

{

}

где параметры_2 должны быть подмножеством параметры_1.

57

Наследование классов

Объявление одного класса наследником другого: class имя_потомка : спец_наслед имя_предка {

};

Спецификаторы наследования:

public – открытая часть класса-предка переходит в открытую часть класса-потомка

private – открытая часть класса-предка переходит в закрытую часть класса-потомка.

Закрытая часть класса-предка присутствует в классе-потомке, но определённым в потомке методам не доступна при любом наследовании (она доступна только через унаследованные методы)!

58

Работа конструкторов и деструкторов при наследовании

Конструкторы срабатывают согласно цепочке наследования – сначала предок, потом потомок, деструкторы – в обратном порядке.

Передача параметров в конструктор базового класса осуществляется следующим образом:

имя_потомка(параметры_1): имя_предка(параметры_2)

{

}

где параметры_2 должны быть подмножеством параметры_1.

59

Переопределение методов при наследовании

Если в классе определён метод с той же сигнатурой, что и метод классапредка, он перекрывает метод классапредка.

Из классапотомка перекрытые методы класса-предка доступны через явное указание имени класса при вызове метода:

имя_класса_предка::имя_метода(парам)

60

Указатели на базовый класс

Указателю на объект базового класса (класса-предка) может быть присвоен адрес объекта любого производного класса (класса-потомка), но обращаться через такой указатель можно только к полям и методам, унаследованным от этого базового класса.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]