Объектно ориентированное программирование (ООП) 


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



ЗНАЕТЕ ЛИ ВЫ?

Объектно ориентированное программирование (ООП)



Классы. Конструкторы

Очень часто программы имеют дело с совокупностями данных: имя, должность, табельный номер и т.д. Каждая отдельная составляющая не описывает челове­ка, смысл имеет только вся вместе взятая информация. Простая структура, такая как массив, прекрасно подходит для хранения отдельных значений, однако совершенно непригодна для хранения совокупности данных разных типов. Таким образом, массив недостаточен для хранения комплексной информации. По причинам, которые вскоре станут понятными, я буду называть такие совокуп­ности информации объектами.

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

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

// Пример класса кредитная карта

class Kredit {

public:

char firstName[128];// фамилие

char lastName[128];// имя

int creditCard; // номер кредитной карты

};

Kredit nds; //nds - экземпляр класса Kredit

 

В принципе простейший класс – это любая структура (struct), доступ к элементам, которой открыт для любого объекта не члена структуры. После ключевого слова public идет описание полей класса. Как видно из лис­тинга, класс Kredit содержит поля имени, фамилии и номера кредитной кар­ты. Первые два поля являются символьными массивами, а третье имеет тип int (будем считать, что это и есть номер кредитной карты).

В последней строке этого фрагмента объявляется переменная nds, которая имеет тип Kredit. Таким образом, nds представляет собой запись, описывающую от­дельного человека. Говорят, что nds является экземпляром класса Kredit и что мы создали этот экземпляр, реализовав класс Kredit. Мы говорим, что поля firstName и ос­тальные являются членами, или свойствами класса.

Для описания полноценного класса (отличного от структуры) используются механизмы сокрытия свойств и/или методов – членов класса, ограничение доступа к определенным пользователем свойствам. Один из форматов описания класса следующий

class <идентификатор> {

private:

< скрытая часть>

public:

<открытая часть>

};

 

Здесь <идентификатор> в дальнейшем используется, как тип экземпляров объекта. Используется для определения объектов данных. Скрытая часть класса – это свойства или/и методы скрытые, недоступные из внешней среды элементы, кроме как, только через методы открытой части или специальным механизмом – friend функций. Синтаксис обращения к членам класса, такой же, как и структур.

Пример программы

Приведенный ниже пример демонстрирует использование класса Kredit.

// DataSet записывает соответствующую информацию массиве объектов

#include <stdio.h>

#include <conio.h>

#include <iostream>

using namespace std;

 

// Пример класса кредитная карта

class Kredit {

public:

char firstName[128];// фамилие

char lastName [128];// имя

int creditCard; // номер кредитной карты

};

 

Kredit nds; //nds - экземпляр класса Kredit

 

// displayData — выводит содержимое данных

void displayData (Kredit & nds)

{

cout<<nds.firstName<<" "<<nds.lastName << "/" <<nds.creditCard << "\n";

}

 

// NameDataSet — содержит имя клиента

// и номер кредитной карты

int getData(Kredit & nds){

cout << "\nВведите имя: ";

cin >> nds.firstName;

if (stricmp (nds.firstName, "exit") == 0)

return 0;

cout << "Введите фамилию: ";

cin >> nds.lastName;

cout << "Введите номер кредитной карты:";

cin >> nds.creditCard;

return 1;

}

//------------------------------------------------

int main(int nArg, char* pszArgs[]) {

setlocale(LC_ALL, "Russian");

const int MAX = 25; // создать 25 объектов типа NameDataSet

Kredit _nds[MAX];

// считывает имена, фамилии и

// номера кредитных карт

cout << "Считывает имя/номер карты\n"

<<"Введите 'exit' в поле имени для выхода\n";

int index = 0;

while(getData(_nds[index])&&index<MAX) index++;

cout << "\nЭлементы:\n";

for (int i = 0; i < index; i++){

displayData(_nds[i]);

}

_getch();

}

 

 

Основное отличие класса от структуры следующее:

В C++ эти конструкции идентичны, за исключением того факта, что структуры по умолчанию открыты для доступа, а классы — закрыты.

Конструктор и деструктор класса в C++

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

Конструктор (от construct – создавать) — это особый метод класса, который выполняется автоматически в момент создания объекта класса. То есть, если мы пропишем в нем, какими значениями надо инициализировать поля во время объявления объекта класса, он сработает без «особого приглашения». Его не надо специально вызывать, как обычный метод класса.

Деструктор (от destruct — разрушать) — так же особый метод класса, который срабатывает во время уничтожения объектов класса. Чаще всего его роль заключается в том, чтобы освободить динамическую память, которую выделял конструктор для объекта. Имя его, как и у конструктора, должно соответствовать имени класса. Только перед именем надо добавить символ ~

Создадим в классе два конструктора: один будет принимать параметры, второй — нет.

#include <iostream>

using namespace std;

 

class SomeData

{

private:

int someNum1;

double someNum2;

char someSymb[128];

public:

SomeData()

{

someNum1 = 0;

someNum2 = 0;

strcpy_s(someSymb, "СТРОКА ПО УМОЛЧАНИЮ!");

cout << "\nКонструктор сработал!\n";

}

 

SomeData(int n1, double n2, char s[])

{

someNum1 = n1;

someNum2 = n2;

strcpy_s(someSymb, s);

cout << "\nКонструктор с параметрами сработал!\n";

}

 

void showSomeData()

{

cout << "someNum1 = " << someNum1 << endl;

cout << "someNum2 = " << someNum2 << endl;

cout << "someSymb = " << someSymb << endl;

}

 

~SomeData()

{

cout << "\nДеcтруктор сработал!\n";

}

};

 

int main()

{

setlocale(LC_ALL, "rus");

SomeData obj1(1, 2.2, "СТРОКА ПАРАМЕТР"); // сработает конструктор с параметрами

obj1.showSomeData();

 

SomeData obj2; // сработает конструктор по умолчанию

obj2.showSomeData();

}

Деструктор определен в строках 34 — 37. Для простоты примера он просто отобразит строку в том месте программы, где сработает. Строка 43 — объявляем объект класса и передаем данные для записи в поля. Тут сработает конструктор с параметрами. А в строке 46 — сработает конструктор по умолчанию.

Видим, что деструктор сработал автоматически и дважды (так как в программе было два объекта класса). Он срабатывает тогда, когда работа программы завершается и уничтожаются все данные.

Важное:

§ Конструктор и деструктор должны быть public;

§ Конструктор и деструктор не имеют типа возвращаемого значения;

§ Имена класса, конструктора и деструктора должны совпадать;

§ Конструктор может принимать параметры. Деструктор не принимает параметры;

§ При определении деструктора перед именем надо добавить символ ~;

§ Конструкторов может быть несколько, но их сигнатура должна отличаться (количеством принимаемых параметров, например);

§ Деструктор в классе должен быть определен только один.

 



Поделиться:


Последнее изменение этой страницы: 2016-12-11; просмотров: 305; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.149.255.162 (0.014 с.)