Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Создание простого конструктора






Конструктор представляет собой метод класса, который имеет такое же имя, как и класс.

class employee

{
public:
employee(char *, long, float); //Конструктор
void show_employee(void);
int change_salary(float);
long get_id(void);
private:
char name [64];
long employee_id;
float salary;
};

В вашей программе вы просто определяете конструктор так же, как любой другой метод класса:

employee:: employee(char *name, long employee_id, float salary)

{
strcpy(employee:: name, name);
employee:: employee_id = employee_id;
if (salary < 50000.0)
employee:: salary = salary;
else // Недопустимый оклад
employee:: salary = 0.0;
}

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

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

/ / создание класса очередь
class queue {
int q[100];
int sloc, rloc;
public:
queue (); // конструктор
void qput(int i);
int qget ();
};

 

Обратим внимание, что конструктор queue() не имеет типа возвращаемого значения. В С++ функции-конструкторы не могут возвращать значений.

Код, реализующий функцию queue(), выглядит следующим образом:

// конструктор
queue:: queue ()
{
sloc = rloc = 0;
cout < < " Queue initialized. \n";
}

 

Дополнением конструктора является деструктор. Во многих случаях перед уничтожением объекта необходимо выполнить определенные действия. Локальные объекты создаются при входе в соот­ветствующий блок программы и разрушаются при выходе из него. Глобальные объекты уничто­жаются при завершении работы программы. Имеется много причин тому, чтобы существовал деструктор. Например, может потребоваться освободить память, которая была ранее зарезерви­рована. В С++ за дезактивацию отвечает деструктор. Он имеет то же самое имя, что и конструк­тор, только к нему добавлен значок ~. Ниже представлен вариант класса queue, использующий конструктор и деструктор. (Следует иметь в виду, что класс queue не нуждается в деструкторе, поэтому ниже он приведен только для иллюстрации.)

// создание класса очередь
class queue {
int q[100];
int sloc, rloc;
public:
queue(); // конструктор
~queue(); // деструктор
void gput(int i);
int qget();
};
// конструктор
queue:: queue()
{
sloc = rloc = 0;
cout < < " Queue initialized.\n";
}
// деструктор
queue:: ~queue ()
{
cout < < " Queue destroyed.\n";
}

Для того чтобы продемонстрировать работу конструктора и деструктора, ниже представлена но­вая версия программы:
#include < iostream.h>
// создание класса очередь
class queue {
int q[100];
int sloc, rloc;
public:
queue (); // конструктор
~queue(); // деструктор
void gput(int i);
int qget();
};
/ / конструктор
queue:: queue ()
{
sloc = rloc = 0;
cout < < " Queue initialized.\n";
}
// деструктор
queue:: ~queue ()
{
cout < < " Queue destroyed.\n";
}
void queue:: qput(int i)
{
if (sloc == 99) {
cout < < " Queue is full.\n";
return;
}
sloc++;
q[sloc] = i;
}
int queue:: qget()
{
if (rloc == sloc) {
cout < < " Queue underflow.\n";
return 0;
}
rloc++;
return q[rloc];
}
int main()
{
queue a, b; // создание двух объектов типа queue
a.qput(10);
b.qput(19);
a.qput(20);
b.qput(1);
cout < < a.qget ()< < " ";
cout < < a.qget ()< < " ";
cout < < b.qget()< < " ";
cout < < b.qget()< < " \n";
return 0;
}

Эта программа выводит на экран следующий текст:

Queue initialized.
Queue initialized.
10 20 19 1
Queue destroyed.
Queue destroyed.

ДРУЖЕСТВЕННЫЕ ФУНКЦИИ

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

· Дружественная функция объявляется внутри класса с модификатором friend

Казалось бы легкое и понятное определение. Объявил функцию внутри класса, дописал перед ней модификатор friend и используй как обычную и независимую от класса функцию вне класса. Если вы заинтересованы в этой теме, то попробуйте применить такую теорию на практике. Думаю подавляющее большинство попробовавших столкнутся с проблемами.

 

#include < conio.h> #include < iostream.h>   class A { int x; //Приватный элемент из класса A friend void get_x(int, A &); //Прототип дружественной функции для занесение в приватный x значения public: void get_x(int); //Прототип обычного метода для занесения значения в приватный x void show(); //Прототип функции для отображения x из приватного поля }; /*Прототипы функций определены внутри класса. Сами функции описаны вне*/   void get_x(int N, A & obj_A) //Функция не является частью класса, но работает словно является { obj_A.x=N; //в элемент x класса A передается принимаемый параметр N }   void A:: get_x(int N) //функция является частью класса A { x=N; //в приватный элемент x класса A заносится принимаемый в N параметр }   void A:: show() //Функция является частью класса A и играет роль посредника { cout< < x< < endl; //Отображаем приватный элемент x из класса A }   void main() { clrscr(); int value=100; //value будет передаваться как параметр вовнутрь класса в приватный x A obj_A;   get_x(value, obj_A); //Работаем как с обычной функцией. obj_A.show(); //Отображаем результаты value=999; //Изменили значение в value   obj_A.get_x(value); //Работаем как с методом объекта obj_A.show(); //Отображаем результаты   getch(); return; }

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

 

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

Так как элемент x был объявлен внутри private, то для отображения этого x необходим посредник, в качестве посредника работает функция show(). Функция show() объявлена внутри класса и значит все поля класса ей доступны. Я надеюсь вы изучили, что такое поле private и дальнейшее описание будет лишним

Коротко говоря:
Внутри класса объявлены

· Приватный элемент x

· Дружественная функция ввода в x значения

· Обычная функция ввода в x значения

· Функция для отображения приватного элемента

 

Одна из причин, почему язык С++ допускает существование функций-друзей, связана с той ситуацией, когда два класса должны использовать одну и ту же функцию. В качестве примера рассмотрим программу, в которой определяются два класса — line и box. Класс line содержит все необходимые данные и код для начертания горизонтальной пунктирной линии любой заданной длины, начиная с указанной точки с координатами х и у и с использованием заданного цвета. Класс box содержит необходимый код и данные для того, чтобы изобразить прямоугольник с заданными левой верхней и правой нижней точками, причем использовать для этого указанный цвет. Оба класса используют функцию same_color() для того, чтобы определить, нарисованы ли линия и прямоугольник одним и тем же цветом. Объявление этих классов выполнено в следую­щем фрагменте программы:

class box {
int color; // цвет прямоугольника
int upx, upy; // левый верхний угол
int lowx, lowy; // правый нижний угол
public:
friend int same_color (line l, box b);
void set_color(int c);
void define_box (int x1, int y1, int x2, int y2);
void show_box();
};
class line {
int color;
int startx, starty;
int len;
public:
friend int same_color (line I, box b);
void set_color(int c);
void define_line (int x, int y, int I);
void show_line();
};

Функция same_color() не является членом ни одного из классов, но является другом обоих. Она возвращает истину, если объект типа line и объект типа box нарисованы одним и тем же цветом, и значение 0 — в противном случае. Следующий код определяет функцию same_color():

 

возвращает истину, если линия и прямоугольник имеют одинаковый цвет
int same_color (line I, box b)
{
if (l.color == b.color) return 1;
return 0;
}

РАБОТА С ОБЪЕКТАМИ

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

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

 

НАСЛЕДОВАНИЕ КЛАССОВ

Цель объектно-ориентированного программирования состоит в повторном использовании созданных вами классов, что экономит ваше время и силы. Если вы уже создали некоторый класс, то возможны ситуации, что новому классу нужны многие или даже все особенности уже существующего класса, и необходимо добавить один или несколько элементов данных или функций. В таких случаях C++ позволяет вам строить новый объект, используя характеристики уже существующего объекта. Другими словами, новый объект будет наследовать элементы существующего класса (называемого базовым классом). Когда вы строите новый класс из существующего, этот новый класс часто называется производным классом. В этом уроке впервые вводится наследование классов в C++. К концу данного урока вы изучите следующие основные концепции:

  • Ели ваши программы используют наследование, то для порождения нового класса необходим базовый класс, т.е. новый класс наследует элементы базового класса.
  • Для инициализации элементов производного класса ваша программа должна вызвать конструкторы базового и производного классов.
  • Используя оператор точку, программы могут легко обращаться к элементам базового и производного классов.
  • В дополнение к общим (public) (доступным всем) и частным (private) (доступным методам класса) элементам C++ предоставляет защищенные (protected) элементы, которые доступны базовому и производному классам.
  • Для разрешения конфликта имен между элементами базового и производного классов ваша программа может использовать оператор глобального разрешения, указывая перед ним имя базового или производного класса.





© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.