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

Sb97282

.pdf
Скачиваний:
1
Добавлен:
13.02.2021
Размер:
998.17 Кб
Скачать

main ()

{

int i=7; float d=1,5; long l=36000; cout<<sqrt_it (i); cout<<sqrt_it (d); cout<<sqrt_it (l); unsigned int u=4; cout<<sqrt_it (u);

}

int sqrt_it (int i) { return i*i; }

float sqrt_it (float d)

{return d*d; } long sqrt_it (long l)

{return l*l; }

Перегруженные функции не могут отличаться только типом возвращаемого значения:

int sqrt_it (long i); long sqrt_it (long i); sqrt_it (67000);

При обращении перед компилятором встает неразрешимая проблема: какую из перегруженных функций выбрать?

8.1. Перегрузка конструктора

Перегрузка конструктора класса осуществляется просто объявлением конструкторов с различным набором параметров.

Пример: class date{

int month, day, year; public: date (int, int, int); date (char *);

date (int); date (void);

};

21

date begin; date today (23);

date my_day (05,06,2000); date xmas (“02 января”);

В зависимости от того, какие параметры заданы, выбирается соответствующий конструктор.

9. АРГУМЕНТЫ ФУНКЦИИ, ЗАДАВАЕМЫЕ ПО УМОЛЧАНИЮ

Пример:

int fun (int x=1, int y=1){ return x*y; } fun (5,10);

fun (4); //”y”– значение по умолчанию; fun (); // оба значения по умолчанию; fun ( ,2); // выдает сообщение об ошибке.

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

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

date (int a=1); – сообщение об ошибке, так как компилятор не знает, какой выбрать конструктор:

date (void);

или date(my_day);

10. НАСЛЕДОВАНИЕ

Наследование – одна из важных черт языков объектноориентированного программирования. Оно реализуется возможностью объединять один класс с другим во время объявления второго класса. Механизм наследования позволяет определять новые классы на основе уже имеющихся.

Класс, на основе которого создается новый класс, называется базовым (родительским классом), а новый – производным (или наследником). Непосредственно базовым классом называется такой класс, который входит в список базовых классов при определении класса. Любой производный класс может стать базовым для других создаваемых классов, таким образом реализуется иерархия классов и объектов.

22

10.1. Одиночное и множественное наследование

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

Механизм одиночного наследования:

А

В

С

Класс А является непосредственно базовым классом; В наследуется от А, С – от В.

Механизм множественного наследования:

А В

С

Класс С наследуется от базовых классов А и В.

10.2. Управление доступом производных классов

При наследовании важную роль играет статус доступа к компонентам класса. В иерархии класса существуют следующие соглашения о правах доступа к компонентам класса:

собственные (private) элементы доступны только внутри класса, где они определены;

защищенные (protected) элементы доступны внутри класса и во всех производных класса;

общедоступные или открытые (public) компоненты класса видимы из любой точки программы.

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

23

являющиеся представителями базовых классов, а также собственные компоненты объекта.

class X { protected: int i; j;

public: void get_ij (void); void put_ij (void) ;};

class Y: public X { int k;

public: int get_k (void); void make_k (void) ;};

Функции-члены класса Y могут использовать функции get_ij, put_ij класса X, но не могут использовать ij, они недоступны для функций get_k и make_k класса Y.

Можно обеспечить доступ функции-члена класса Y к элементам класса X, описав их как protected. В то же время ij остаются недоступными для остальной части программы.

Доступ наследуется к элементам, объявленным защищенными или общими, и не наследуются для собственных private-элементов. При описании производного класса можно изменить статус доступа наследуемым компонентам класса с помощью модификатора статуса доступа.

Выглядит это следующим образом:

class имя_производного класса: [модификатор] имя базового класса{…}

В качестве модификатора статуса доступа используются ключевые слова protected, private и public. Модификатор доступа может отсутствовать и тогда по умолчанию считается public, если производный класс – структура, и private, если производный класс – класс. Если режим доступа public, то все общие и защищенные элементы базового класса остаются общими и защищенными элементами производного класса. Если режим доступа private, то все общие и защищенные элементы базового класса становятся privateэлементами производного класса. Если режим доступа protected, то общие и защищенные элементы базового класса становятся защищенными элементами в производном классе.

24

Режим доступа без класса

 

Режим доступа в производном классе

private

 

недоступен

protected

public

protected

public

 

public

private

protected

недоступен

protected

 

protected

public

 

protected

private

рrivate

недоступен

protected

 

private

public

 

public

Таким образом, в производных классах статус доступа компонентов класса может быть ужесточен.

#include <iostream.h> class X {

protected: int i, j; public: int get_ij (void);

int put_ij (void);}; class Y: public X {

int k;

public: int get_k (void); void make_k (void) ;}; class Z: public Y { public: void f (void) ;}; void X :: get_ij (void)

{

cout <<”Введите 2 числа:”; cin>>i>>j;

}

void X :: put_ij (void)

{

cout <<”i=”<<i<<”j=”<<j;

}

int Y :: get_k (void) {return k ;}

void Y :: make_k (void)

25

{k=j+i ;}

void Z :: f (void) {i=2; j=3 ;} main ()

{

Y var; Z var2; var.get_ij (); var.put_ij (); var.make_k (); cout <<var.get_k (); var2.f (); var2.put_ij (); var2.make_k (); cout <<var.get_k ();

}

10.3. Конструкторы с параметрами при наследовании

Пока конструкторы базовых классов не имеют аргументов, производный класс может не иметь функцию «конструктор». Если же конструктор базового класса имеет один или несколько аргументов, каждый производный класс обязан иметь конструктор. Чтобы передать аргументы в базовый класс нужно объявить их после объявления конструктора базового класса.

Синтаксис:

Конструктор производного класса (список аргументов.): базовый класс1 (список аргументов),

Базовый класс п. (список аргументов.) {…}

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

#include <iostream.h> class x {

protected: int x; public: x (int i) {x=i ;}

26

~x () {}

void put_x (int i) {x=i ;}

int get_x (void) {return x ;}

void show (void) }; class y: public x { protected: int y; public: y (int I; int j); ~y () {}

void put_y (int i) {y=i ;}

int get_y (void) {return y ;}

void show (void); }; class z: public y { protected: int z; public: z (int i; int j); ~z () {}

void make_z (void); void show (void) ;}; void x :: show (void) {cout <<x ;}

y :: y (int i, int j): x (i) {y=j ;}

void y :: show (void) {cout <<x<<y ;}

z: z (int i, int j): y (i, j) {} void z :: make_z (void) {z= x*y ;}

void z :: show (void)

{cout << z<< “=”<<x<<”*”<<y ;} main (void)

{

27

z zobj (3, 5); zobj. make_z (); zobj. show (); zobj. x :: show (); zobj. y :: show (); zobj. pub_x (7); zobj. pub_y (9); zobj. make_7 (); zobj. show (); zobj. x :: show (); zobj. y :: show ();

}

В примере использована следующая схема наследования: class x → class y → class z.

Классы x и y, по сути, равноправны, но из-за реализации механизма простого наследования класс y отличается от x числом параметра конструктора.

10.4. Множественное наследование

Множественное наследование представляет собой наследование, при котором создание производного класса основывается на использовании непосредственных базовых классов.

Выглядит это следующим образом: class имя производного класса. [модификатор]

имя_базового класса1, имя_базового класса2,…,n {…};

Рассмотрим пример при множественном наследовании: class X

class Z

class Y

11. СРЕДА ПРОГРАММИРОВАНИЯ DEVC++

Для выполнения лабораторных работ по программированию (дисциплина «Информатика») рекомендуется использовать среду разработки программ для Windows "DevC++".

28

11.1. Возможности среды программирования

Среда разработки "DevC++" является представителем OpenSourceпродуктов и распространяется свободно, согласно лицензии GNU GPL , версия 2. В качестве компилятора в среде программирования используется Ком-

пилятор TDM-GCC версия GnuCCompiler для Windows.

Скачать актуальную версию "DevC++" можно, перейдя по ссылке: http://sourceforge.net/projects/orwelldevcpp/.

В "DevC++" можно создавать несколько типов приложений и динамически подключаемых библиотек: консольные, оконные приложения, статические и динамические библиотеки. Есть возможность отладки программ и их пошагового выполнения. Кроме этого, "DevC++" позволяет использовать плагины для расширения функционала среды разработки.

11.2. Интерфейс среды программирования

Внешний вид интерфейса среды программирования "DevC++" представляет собой основное окно программы, которое можно разделить на области.

Левая часть окна содержит закладки Project/Classes/Debug. С их помощью можно отобразить файловую структуру проекта (Project), структуру классов и функций (Classes), просматриваемые переменные (Debug).

Центральная часть окна занята кодом программы (main.cpp).

В нижней части окна можно увидеть ряд функциональных вкладок:

Compiler/Resources/CompileLog/Debug/FindResults/Close.

Compiler – закладка, в которой выводятся ошибки компиляции, при клике на них можно перейти в код программы, где ошибка выявлена.

Resources – закладка управления ресурсами Windows-приложения: изображения, иконки и т. п.

CompileLog – журнал компиляции, в нем показываются результаты компиляции (если есть ошибки, открывается закладка Compiler).

Debug – закладка отладчика, с ее помощью можно запустить процесс отладки и управлять им.

FindResults – результаты поиска в файле. При клике на него осуществляется переход на найденный результат поиска в коде.

Close – кнопка, которая сворачивает нижнюю панель, оставляя только заголовки закладок.

29

11.3. Написание и компиляция кода программы

Ввод кода осуществляется в центральной части окна (main.cpp – имя редактируемого файла). В процессе редактирования подсвечиваются парные скобки и кавычки. При нажатом Ctrl и клике по имени функции, переменной или по константе осуществляется переход на объявление этой функции.

Для компиляции программы можно воспользоваться главным меню Execute (рис. 11.1) или сочетаниями клавиш. Компиляция выполняется через пункты меню Execute→Compile или клавишей F9.

Запуск программы выполняется через пункты меню Execute→Run или клавишей F10. Запуск программы с компиляцией выполняется через пункты меню

Execute→Compile & Run или клавишей F11.

Если программа состоит из нескольких файлов или менялись настройки проекта, удобно использовать меню

Execute→RebuildAll для перестройки все-

го проекта, всех объектных и исполняе-

Рис. 11.1. Компиляция программы мых файлов клавишей F12.

Когда в коде программы есть ошибки, они отображаются в нижнем блоке в закладке Compiler (рис. 11.2).

Рис. 11.2. Отображение ошибок компиляции

30

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