Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Иерархия классов.docx
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
42.95 Кб
Скачать

17)Чистые виртуальные функции. Абстрактные классы

class A { public: virtual void v_function(void)=0;//чистая виртуальная функция  };

Как видите, все отличие только в том, что появилась конструкция «=0», которая называется «чистый спецификатор». Чистая виртуальная функция абсолютно ничего не делает и недоступна для вызовов. Ее назначение – служить основой (если хотите, шаблоном) для замещающих функций в производных классах. Класс, который содержит хотя бы одну чистую виртуальную функцию, называется абстрактным классом.

Почему абстрактным? Потому, что создавать самостоятельные объекты такого класса нельзя. Это всего лишь заготовка для других классов. Механизм абстрактных классов разработан для представления общих понятий, которые в дальнейшем предполагается конкретизировать. Эти общие понятия обычно невозможно использовать непосредственно, но на их основе можно, как на базе, построить производные частные классы, пригодные для описания конкретных объектов.

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

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

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

Некоторые элементы класса могут быть объявлены с модификатором static. Их называют статическими. Они являются общими для всех объектов данного класса. Изменив значение статического элемента класса в одном объекте, мы получим изменившееся значение во всех других объектах класса. Т.е.статический элемент связан с классом, а не с объектом.

Объявление:

static тип имя

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

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

Методы класса также могут быть статическими. Такие методы не получают указатель this, соответственно они не могут обращаться к нестатическим элементам класса. Они не могут быть виртуальными.

К статическим элементам класса можно обращаться даже если не создано ни одного объекта данного класса.

Например, функция a() – статическая функция класса Cl, тогда вызов этой функции:

Cl::a(); //т.е. используется полное имя элемента класса

Приведем пример использования статических элементов класса для подсчета числа существующих и созданных объектов класса.

19) Перегруженные функции

Одним из путей реализации полиморфизма в С++ является перегрузка (overloading) функций. Две или более функции могут иметь одно и то же имя, но отличаться друг от друга количеством или типом параметров. Тогда говорят о перегруженных функциях (overload functions).

21) Аргументы функции, задаваемые по умолчанию.

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

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

Например:

void f(int i=0, int j=1); // прототипы

void f(int i, intj)

{

};

Такую функцию можно вызвать тремя способами:

f(); // i=0, j=1

f(10); // i=10, j=1

f(10, 20); // i=11, j=22

Замечания:

1.Все параметры по умолчанию должны находиться правее аргументов, передаваемых обычным путем

2.Аргументами по умолчанию могут быть только константы или глобальные переменные.

3.Использование аргумента по умолчанию является простейшей формой перегрузки функции. Здесь, т.к. функция одна – алгоритм один, а в перегруженных функциях могут быть реализованы различные аргументы.

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

Например:

void f(void);

void f(int i=0);

При вызове f(); компилятор выдаст ошибку неоднозначности выбора.

22) Параметры и аргументы функции.

В языке С все аргументы функции передаются по значению. При вызове функции в стеке выделяется место для формальных параметров функции, и в это место заносится значение фактического параметра при вызове функции. Далее функция использует и меняет значение в стеке. При выходе из функции измененные значения параметров теряются.

Например:

void swap(int a, int b)

{ int tmp=a;

a=b;

b=tmp;

}

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

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

Такой прием называется передачей параметра по ссылке.

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

[Если в качестве аргумента берется имя массива, то передаваемое функции значение фактически есть адрес первого элемента массива.]