Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Билеты по ООП.doc
Скачиваний:
4
Добавлен:
14.04.2019
Размер:
596.48 Кб
Скачать

15. Перегрузка функций

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

Пример

#include <iostream>

using namespace std;

// sqr_it перегружается три раза

int sqr_it(int i);

double sqr_it(double d);

long sqr_it(long l);

int main( )

{

cout << sqr_it(10) << “\n”;

cout << sqr_it(11.0) << “\n”;

cout << sqr_it(9L) << “\n”;

return 0;

}

int sqr_it(int i)

{

cout << “Inside the sqr_it( ) function that uses “;

cout << “an integer argument.\n”;

return i*i;

}

double sqr_it(double d)

{

cout << “Inside the sqr_it( ) function that uses “;

cout << “an double argument.\n”;

return d*d;

}

long sqr_it(long l)

{

cout << “Inside the sqr_it( ) function that uses “;

cout << “an long argument.\n”;

return l*l;

}

В этой программе создаются три сходные, но различные функции с именами sqr_it(), каждая из которых возвращает квадрат своего аргумента. Компилятор знает, какую функцию использовать, благодаря типу аргумента. Значение перегруженных функций заключается в том, что они позволяют обеспечивать доступ к целому набору функций, используя общее имя. Перегрузка функций важна потому, что она помогает в решении проблемы сложности. Хотя можно использовать одно и то же имя для перегрузки функций выполняющих совершенно разные задачи, делать этого не следует.

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

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

Для конструкторов выполняются следующие правила:

  1. для конструктора не указывается возвращаемый тип;

  2. конструктор не может возвращать значение;

  3. конструктор не наследуется.

Деструктор

Деструктор является дополнением конструктора. Он имеет то же имя, что и класс, но с префексом-тильдой (~). Он вызывается всякий раз, когда уничтожается представитель класса. Для деструктора существуют следующие правила:

  1. деструктор не может иметь аргументов;

  2. деструктор не может возвращать значения;

  3. деструктор не наследуется.

17. Параметризированные конструкторы

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

Общая форма передачи аргументов конструктору:

ярлык_класса объект(список_аргументов);

Пример

#include <iostream>

using namespace std;

class widget {

int i;

int j;

public:

widget(int a, int b);

void put_widget( );

};

widget::widget(int a, int b)

{

i = a;

j = b;

}

void widget::put_widget( )

{

cout << i << “ “ << j << “\n”;

}

int main( )

{

widget x(10, 20), y(0, 0);

x.put_widget( );

y.put_widget( );

return 0;

}

18. Дружественные функции

Разрешить обычной функции или функции-элементу другого класса полный доступ к элементам класса, объявленным private или protected, можно с помощью описания friend в определении данного класса.

Пример.

class myclass

{

friend void another_class::member(int);

friend void func_name(float);

};

Для друзей существуют следующие правила:

  1. на описания friend не влияют спецификаторы public, protected или private;

  2. описания friend не взаимны: если А объявляет В другом, то это не означает, что A является другом для B;

  3. дружественность не наследуется: если А объявляет В другом, классы, производные от В, не будут автоматически получать доступ к элементам А;

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