Перегрузка функций. Переопределение функций



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

Фактически, перегрузка - типичное проявление полиморфизма.

Пример

 

class Student

{

private:

char * Name;

double newBall;

public:

void printInfo(int typeInfo)

{

if (typeInfo == 1)

printf («%s», this ->Name);

if (typeInfo == 2)

printf («%5.2f», this->newBall);

}

void printInfo( )

{

printf («%s %5.2f», this->Name, this->newBall);

}

}

//печатает всю информацию, либо определенную

 

Переопределение - это замена функции (метода), функционал которой был определен ранее. Наиболее часто переопределение проявляется при наследовании.

 

Конструктор

Конструктор – это метод, который вызывается при создании объекта и производит инициализацию переменных членов. Это метод имеет такое же имя, как и класс.

Свойства конструкторов:

– конструктор не возвращает значение, даже типа void; нельзя получить указатель на конструктор;

– класс может иметь несколько конструкторов с разными параметрами для разных видов инициализации (при этом используется механизм перегрузки);

– конструктор, вызываемый без параметров, называется конструктором по умолчанию;

– параметры конструктора могут иметь любой тип, кроме этого же класса; можно задать параметры по умолчанию, но их может содержать только один из конструкторов;

– если программист не указал ни одного конструктора, то компилятор создаст его автоматически;

– конструкторы не наследуются;

– конструкторы нельзя описывать с модификаторами const, virtual и static;

– конструкторы глобальных объектов вызываются до вызова функции main; локальные объекты создаются, как только становится активной область их действия; конструктор запускается и при создании временного объекта (например, при передаче объекта из функции);

– конструктор вызывается, если в программе встретилась какая-либо из синтаксических конструкций:

 

имя_класса имя_объекта [(список параметров)];

//список параметров не должен быть пустым

 

имя_класса (список параметров);

//создается объект без имени (список параметров может быть пустым)

 

имя_класса имя_объекта = выражение;

//создается объект без имени и копируется

 

Например,

 

point p1(10,10), p2(20), p3;

point p4 = point(100);

point p5 = 200;

 

В первом операторе создаются три объекта. Значения не указанных параметров устанавливаются по умолчанию. Во втором операторе создается безымянный объект со значениемпараметра x=100 (значение второго параметра устанавливается по умолчанию). Выделяется память под объект p4, в которую копируется безымянный объект.

Во третьем операторе создается безымянный объект со значением параметра x=200 (значение второго параметра устанавливается по умолчанию). Выделяется память под объект p5, в которую копируется безымянный объект. Такая форма создания объекта возможна в том случае, если для инициализации объекта допускается задать один параметр.

 

Пример. Использование перегруженных конструкторов.

 

enum color {red, green, blue}; class point

{

double x,y; color cp; char *name;

public:

point(double xVal=0.0, double yVal=0.0); point(color cl);

point(char *np);

...

};

point::point(double xVal, double yVal) {x=xVal; y=yVal;}

point::point(color cl)

{

switch (cl) {

case red: x=100;y=100;cp=red;name=0;break; case green: x=200;y=200;cp=green;name=0;break; case blue: x=300;y=300;cp=blue;name=0;break;

} }

point::point(char *np) {

name=new char[strlen(np)+1]; strcpy(name,np);

x=100; y=100; cp=red;

}

...

point p1(10,10),p2(10),p3;

point p4(green);

point p5(«X1");

 

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

Деструкторы

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

Деструктор вызывается автоматически:

– для локальных объектов – при выходе из блока, в котором они объявлены;

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

– для глобальных – как часть процедуры выхода из main;

Между конструктором и деструктором существует ряд различий.

1. Деструкторы могут быть виртуальными, а конструкторы – нет.

2. Деструкторам нельзя передавать аргументы.

3. В каждом классе может быть объявлен только один деструктор.

Имя деструктора состоит из имени класса, перед которым стоит ~

(тильда).

 

class point

{... public:

point () {x=0; y=0;} ~point() {};

...

};

 


Дата добавления: 2019-09-13; просмотров: 201; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!