Студопедия

КАТЕГОРИИ:

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

Чтo такое модификатор доступа?




Помимо модификатора доступа private, можно воспользоваться модификатором public— он сообщает о том, что переменная класса является открытой и ею можно безо всяких ограничений пользоваться в любом месте программы. Позднее мы познакомимся с третьим модификатором доступа, protected, который ограничивает доступ к переменной и допускает к ней только объекты нашего класса, а также объекты классов, производных от него (вскоре вы поймете, что означает это.

Давайте воспользуемся ключевым словом publicи объявим переменную с именем PubllcDataMember:

#include <iostream.h>

class DataClass {

        int PrivateDataMember;

         int PublicDataMember;

}

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

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

#include <iostream.h>

class DataClass

 {

private:

int PrivateDataMember;

public:

int PublicDataMember;

 int PublicMethod(void);

};

ПРИМЕЧАНИЕ: Методы обычно работают с внутренними данными класса, причем подробности этой работы скрываются от внешних частей программы. Это чрезвычайно полезно, поскольку большую программу удается разбить на блоки приемлемого размера. Собственно, объекты были предназначены именно для этой цели.

Данные передаются методам в виде переменных, которые называются параметрами. Это может выглядеть, например, так: add(variable1, variable2). Метод использует передаваемые данные так, как это делается и в других языках программирования.

Однако наш метод не получает параметров. На это указывает ключевое слово void: int PublicMethod(void) (присутствие voidв круглых скобках необязательно - можно написать просто int PublicMethod ();). Кроме того, приведенное выше объявление сообщает, что метод возвращает значение целого типа: для этого в начале объявления ставится ключевое слово int. Итак, наш метод не получает параметров и возвращает целое значение.

Метод PublicMethod() объявлен. Остается понять, как же написать его код? Мы отделим определение метода от объявления класса и снабдим определение префиксом DataClass::. Он сообщает Visual C++, к какому классу относится определяемый метод.

#include <iostream.h>

class DataClass

{

private:

int PrivateDataMember;

public:

int PublicDataMember;

int PublicMethod(void);

}:

Int DataClass::PublicMethod(void)

{

 } 

Теперь все готово к написанию кода метода. Наш метод не получает параметров, но возвращает целое значение. Какое значение он должен возвращать? Поскольку переменная PrivateDataMemberнедоступна за пределами класса, пусть метод PublicMethodвозвращает ее значение, чтобы его можно было узнать в любом месте программы.

ПОДСКАЗКА: Обращение к закрытым переменным через методы наподобие PublicMethod() входит в число стандартных приемов программирования; тем самым удается ограничить доступ к закрытым данным класса.

Код метода PubllcMethod() будет выглядеть так (поскольку он принадлежит классу DataClass, то может беспрепятственно обращаться к закрытой переменной PrivateDataMember):

#include <iostream.h>

class DataClass

{

private:

int PrivateDataMember;

public:

int PublicDataMember;

 int PublicMethod(void);

}

int DataClass::PublicMethod(void)

{

return PrivateDataMember;

}

Метод PublicMethod() должен возвращать значение переменной класса PrivateDataMember— но какое значение в ней будет храниться? Мы еще не инициализировали эту переменную и не присвоили ей никакого значения, так что возвращаемая методом PublicMethod() величина не будет иметь никакого смысла. Необходимо позаботиться об инициализации PrivateDataMember.

Инициализация данных класса в конструкторе

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

Конструктором класса называется специальный метод, который выполняется в программе при создании объекта данного класса. Как мы сейчас увидим, в конструкторе удобно инициализировать данные класса. Имя конструктора совпадает с именем класса, и он не возвращает никакого значения. Тем не менее, конструктору можно передать любое количество параметров. В нашем примере конструктор будет получать всего один параметр — значение, которое должно быть присвоено PrivateDataMember при создании объекта.

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

#include <iostream.h>

class DataClass

{

private:  

int PrivateDataMember:

public:

DataClass(int value);

int PublicDataMember; 

int PublicMethod(void);

};

Затем необходимо определить конструктор:

DataClass::DataClass(int Value)

{

}

В нашем примере достаточно сохранить переданную величину в PrivateDataMember:

DataClass::DataClass(int Value)

{

PrivateDataMember = Value;

}

Готово. У нас есть класс с открытыми и закрытыми переменными и методом, который можно вызывать в программе. Осталось лишь воспользоваться им, и в этом Вам поможет функция main().

Использование класса DataClass

Включите в файл classes.cpp функцию main():

#include <iostream.h>

class DataClass

{

private:  

int PrivateDataMember:

public:

DataClass(int value);

int PublicDataMember; 

int PublicMethod(void);

};

DataClass::DataClass(int Value)

{

PrivateDataMember = Value;

}

 

int DataClass::PublicMethod(void)

{

return PrivateDataMember;

}

Void main()

{

 }

Функция main() содержит код, выполняемый при запуске программы. Мы начнем ее с объявления объекта класса DataClass. Одновременно с этим мы передадим значение конструктору класса (оно будет присвоено переменной PrivateDataMember). Пусть это будет значение 1; тогдаобъект DataObject, принадлежащий классу DataClass, будет создаваться следующим образом:

void main()

{

DataClass DataObject(1);

}

Теперь у нас есть объект с именем DataObject. Он содержит данные, которые мы в него занесли, а также поддерживает метод PublicMethod().

Чтобы присвоить значение открытой переменной класса, PublicDataMember, можно воспользоваться оператором "точка" (.) языка C++. В следующем фрагменте этой переменной присваивается значение 2:

void main()

{

DataClass DataObject(1);

DataObject.PublicDataMeniber = 2; 

}

Обычно все обращения к членам объекта (переменным и функциям) происходят именно так. Например, мы можем вывести значение переменной PublicDataMeinber, посылая его в поток cout:

void main()

{

DataClass DataObject(1);

DataObject.PublicDataMeniber = 2;

cout <<"DataObject.PublicDataMember = "

<<DataObject. PublicDataMeniber<<\n";

}

Но как получить значение, присвоенное PrivateDataMember? Поскольку код в функции main() не принадлежит объекту DataObject, из него нельзя напрямую обратиться к закрытой переменной этого объекта. Чтобы добраться до нее, надо вызвать метод PublicMethod()и вывести полученное значение:

void main()

{

DataClass DataObject(1);

DataObject.PublicDataMeniber = 2;

cout <<"DataObject.PublicDataMember = "

<<DataObject.PublicDataMember<<\n";

cout <<DataObject.PrivateDataMember = "

<<DataObject.PrivatePublicMethod()<<\n";

}

Программа работы с классами готова — запустите ее. Результаты ее работы будут в окне classes. Как видно из рисунка, нам удалось вывести значения и открытой, и закрытой переменных объекта DataClass. Первое знакомство с классами и объектами C++ состоялось.

Наш первый пример был крайне примитивным — он всего лишь показал, как создать класс и объект в программе.

Он совершенно не раскрывает основной смысл объектов — хранение данных и внутреннюю работу с ними.

Помимо конструкторов в C++ существуют деструкторы — они вызываются при уничтожении объекта и содержат код "сборки мусора". В нашем примере деструктор будет уничтожать выделенную ранее область памяти.

Деструкторы C++

Деструктор отчасти похож на конструктор, только он автоматически вызывается при уничтожении объекта. Междуними существует даже внешнее сходство, но имя деструктора снабжается префиксом ~ ("тильда"):

#include <iostream.h>

class SchoolClass {

int *ClassData;

int ClassDataIndex;

public:

SchoolClass(int NumberStudents);

~SchoolClass(void);

};

SchoolClass::SchoolClass(int NumberStudents)

{

         ClassData= new int[NumberStudents];

         ClassDataIndex = 0;

SchoolClass::~SchoolClass(void)

{

}

Деструктор должен вернуть системе область памяти, выделенную при выполнении конструктора. Для оператора new существует противоположный по смыслу оператор delete, при помощи которого можно уничтожить массив:

SchoolClass::~SchoolClass(void)

{

delete ClassData;

}

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










Последнее изменение этой страницы: 2018-04-12; просмотров: 545.

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