Открытые и закрытые члены класса — КиберПедия 

Биохимия спиртового брожения: Основу технологии получения пива составляет спиртовое брожение, - при котором сахар превращается...

Семя – орган полового размножения и расселения растений: наружи у семян имеется плотный покров – кожура...

Открытые и закрытые члены класса

2017-10-21 371
Открытые и закрытые члены класса 0.00 из 5.00 0 оценок
Заказать работу

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

• открытые public (публичные), вызов открытых членов и методов класса осуществляется с помощью оператора. ("точка");

• закрытые private (приватные), доступ к которым возможен только с помощью открытых методов.

• защищенные методы (protected).

 

После описания класса необходимо описать переменную типа class.

Например,

name_class name;

здесь name_class – имя класса, name – имя переменной.

В дальнейшем переменную типа class будем называть «объект» или «экземпляр класса». Объявление переменной типа class (в нашем примере переменная name типа name_class) называется созданием (инициализацией) объекта (экземпляра класса). После описания переменной можно обращаться к членам и методам класса. Обращение к членам и методам класса осуществляется аналогично обращению к полям структуры.

Следующая программа создает два объекта employee. Используя оператор точку, программа присваивает значения элементам данных. Затем программа использует элемент show_employee для вывода информации о служащем:

 

#include <iostream.h>

#include <string.h>

class employee

{
public:
char name [64];
long employee_id;
float salary;
void show_employee(void)

{
cout << "Имя: " << name << endl;
cout << "Номер служащего: " << employee_id << endl;
cout << "Оклад: " << salary << endl;
};
};

void main(void)

{
employee worker, boss;
strcpy(worker.name, "John Doe");
worker.employee_id = 12345;
worker.salary = 25000;
strcpy(boss.name, "Happy Jamsa");
boss.employee_id = 101;
boss.salary = 101101.00;
worker.show_employee();
boss.show_employee();
}

Конструктор

Конструктор класса – это метод класса, вызываемый при создании объекта и служащий для задания данным объекта начальных значений. Конструктор имеет то же имя, что и класс и не имеет типа. Указывать конструктор не обязательно; если конструктор не объявлен, при создании объекта будет вызван стандартный конструктор, который просто создаст данные-члены объекта в памяти, при этом в них будет находиться «мусор», поэтому желательно всегда явно указывать конструктор, задающий начальные значения полям объекта.

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

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

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

Ниже приведён пример обновлённого класса Apple, который включает новый параметр weight – вес яблока в граммах и объявления конструкторов вышеописанных трёх типов:

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

Далее идёт конструктор, в который передаются все параметры нового яблока (вес и цвет).

Последний конструктор – конструктор копирования, он копирует данные из другого объекта.

Обращения к членам класса осуществляется через «.» – оператор выбора члена, а если используется указатель на объект, то посредством «->» – оператора непрямого выбора члена, который используется вместо точки.

Тело функции-члена можно описать и вне описания самого класса, для этого используется следующая форма:

Оператор «::» называется оператором расширения видимости, он указывает, из какого класса данный метод, после оператора идёт собственно имя метода. В целом реализация метода вне класса не отличается от реализации обычной функции, только вместе с именем метода необходимо указывать класс, из которого этот метод, при помощи «::».

Сам метод обязан быть объявлен внутри класса, как на картинке выше, это называется прототипом функции – объявление функции с указанием типа возвращаемого значения, имени и списка параметров, без тела функции. Вместо тела функции используется точка с запятой. Имена переменных в списке параметров можно не указывать. Функция должна быть реализована также как и обычная функция в любом подходящем для этого месте программы после прототипа, с тем лишь отличием, что её можно использовать сразу после объявления прототипа. Далее идёт объявление прототипа функции func и её реализация, использование функции возможно сразу после строчки с прототипом, имя параметра при объявлении прототипа не указано:

Добавим члены класса и дополним класс Apple до более полного описания яблока:

Здесь описаны новые методы ccal и price, возвращающие калорийность и цену яблока соответственно. Также созданы объекты GreenApple, RedApple и RedApple2, демонстрирующие работу конструкторов. Для GreenApple вызван конструктор без параметров, для RedApple поля проинициализированы значениями белого цвета и веса в 500 грамм, а RedApple2 создан как копия RedApple и после создания имеет те жеполя, что и RedApple. Далее членам GreenApple присваиваются другие значения, зелёный цвет и вес, равный весу RedApple.

Полиморфизм

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

Виртуальные функции являются особыми функциями, потому что при вызове объекта производ­ного класса с помощью указателя или ссылки на него С++ определяет во время исполнения про­граммы, какую функцию вызвать, основываясь на типе объекта. Для разных объектов вызываются разные версии одной и той же виртуальной функции. Класс, содержащий одну или более вир­туальных функций, называется полиморфным классом (polymorphic class).

Виртуальная функция объявляется в базовом классе с использованием ключевого слова virtual. Когда же она переопределяется в производном классе, повторять ключевое слово virtual нет не­обходимости, хотя и в случае его повторного использования ошибки не возникнет.

В качестве первого примера виртуальной функции рассмотрим следующую короткую программу:

// небольшой пример использования виртуальных функций
#include <iostream.h>
class Base {
public:
virtual void who() { // определение виртуальной функции
cout << *Base\n";
}
};
class first_d: public Base {
public:
void who() { // определение who() применительно к first_d
cout << "First derivation\n";
}
};
class seconded: public Base {
public:
void who() { // определение who() применительно к second_d
cout << "Second derivation\n*";
}
};
int main()
{
Base base_obj;
Base *p;
first_d first_obj;
second_d second_obj;
p = &base_obj;
p->who(); // доступ к who класса Base
p = &first_obj;
p->who(); // доступ к who класса first_d
p = &second_ob;
p->who(); // доступ к who класса second_d
return 0;
}

Программа выдаст следующий результат:
Base
First derivation
Second derivation


Поделиться с друзьями:

Особенности сооружения опор в сложных условиях: Сооружение ВЛ в районах с суровыми климатическими и тяжелыми геологическими условиями...

Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰)...

Наброски и зарисовки растений, плодов, цветов: Освоить конструктивное построение структуры дерева через зарисовки отдельных деревьев, группы деревьев...

История развития хранилищ для нефти: Первые склады нефти появились в XVII веке. Они представляли собой землянные ямы-амбара глубиной 4…5 м...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.009 с.