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


Полезное:

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


Категории:

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






Создание объектов. Объекты и методы





Классы, объявление классов, спецификаторы доступа, поля классов, инкапсуляция.

 

Инкапсуляция.

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

является очень важным критерием качества программы. Инкапсуляция позволяет использовать класс в другом окружении и быть уверенным, что он не испортит не принадлежаш;ие ему области памяти, а также создавать библиотеки классов для применения во многих программах.

Класс.

Класс является абстрактным типом данных, определяемым пользователем, и представляет собой модель реального объекта в виде данных и функций для работы с ними. Данные класса называются полями (по аналогии с полями структуры), а функции класса — методами. Поля и методы называются элементами класса. Описание класса в первом приближении выглядит так:

class <имя>{

[ private: ]

<описание скрытых элементов>

public:

<описание доступных элементов>

}; / / Описание заканчивается точкой с запятой

Спецификаторы доступа private и рubliс управляют видимостью элементов класса. Элементы, описанные после служебного слова private, видимы только внутри класса. Этот вид доступа принят в классе по умолчанию. Интерфейс класса описывается после спецификатора public. Действие любого спецификатора распространяется до следующего спецификатора или до конца класса. Можно задавать несколько секций private и public, порядок их следования значения не имеет.

Поля класса:

• могут иметь любой тип, кроме типа этого же класса (но могут быть указателями

или ссылками на этот класс);

• могут быть описаны с модификатором const, при этом они инициализируются только один раз (с помощью конструктора) и не могут изменяться;

• могут быть описаны с модификатором static, но не как auto, extern и register.

Инициализация полей при описании не допускается.

Классы могут быть глобальными (объявленными вне любого блока) и локальными

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

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

class monstr{

int health, ammo:

public:

monstr(int he = 100. int am = 10){ health = he: ammo = am:}

void drawCint x. int y, int scale, int position):

int get_health(){return health:}

int get_ammo(){return ammo:}

}:

В этом классе два скрытых поля — health и ammo, получить значения которых извне можно с помощью методов get_health() и get_ammo(). Доступ к полям с помощью методов в данном случае кажется искусственным усложнением, но надо учитывать, что полями реальных классов могут быть сложные динамические структуры, и получение значений их элементов не так тривиально. Кроме того, очень важной является возможность вносить в эти структуры изменения, не затрагивая интерфейс класса. Все методы класса имеют непосредственный доступ к его скрытым полям, иными словами, тела функций класса входят в область видимости private элементов класса.

В приведенном классе содержится три определения методов и одно объявление (метод draw). Если тело метода определено внутри класса, он является встроенным (inline). Как правило, встроенными делают короткие методы. Если внутри класса записано только объявление (заголовок) метода, сам метод должен быть определен в другом месте программы с помощью операции доступа к области видимости (::):

void monstr::draw(int х. int у. int scale, int position)!

/ * тело метода */

}

Метод можно определить как встроенный и вне класса с помощью директивы inline (как и для обычных функций, она носит рекомендательный характер): inline int monstr::get_ammo(){

return ammo:

}

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

 

2.Методы и их реализация на примере класса «Комплексное число»

 

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

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

class Complex {

public:

int real; // вещественная часть

int imaginary; // мнимая часть

void Add(Complex x);

// прибавить комплексное число

};

Приведенный выше пример - упрощенное определение класса Complex, представляющее комплексное число. Для класса Complex определен метод - Add.

Определение методов класса

void

Complex::Add(Complex x)

{

this->real = this->real + x.real;

this->imaginary = this->imaginary +

x.imaginary;

}

Первые две строки говорят о том, что это метод Add класса Complex. В фигурных скобках записано определение операции или метода Add. Это определение означает следующее: для того чтобы прибавить значение объекта класса Complex к данному объекту, надо сложить вещественные части и запомнить результат в атрибуте вещественной части текущего объекта. Точно так же следует сложить мнимые части двух комплексных чисел и запомнить результат в атрибуте текущего объекта, обозначающем мнимую часть. Запись this-> говорит о том, что атрибут принадлежит к тому объекту, который выполняет метод Add (объекту, получившему сообщение Add). В большинстве случаев this-> можно опустить.В записи определения метода какого либо класса упоминание атрибута класса без всякой дополнительной информации означает, что речь идет об атрибуте текущего объекта.

Теперь приведем этот небольшой пример полностью:

// определение класса комплексных чисел

class Complex {

public:

int real; // вещественная часть

int imaginary; // мнимая часть

void Add(Complex x);

// прибавить комплексное число

};

// определение метода сложения

void

Complex::Add(Complex x)

{

real = real + x.real;

imaginary = imaginary + x.imaginary;

}

int

main()

{

Complex number;

number.real = 1;

// первый объект класса Complex

number.imaginary = 3;

Complex num2;

// второй объект класса Complex

num2.real = 2;

num2.imaginary = 1;

number.Add(num2);

// прибавить значение второго

// объекта к первому

return 1;

}

 

 

Создание объектов. Объекты и методы

 

Конкретные переменные типа «класс» называются экземплярами класса, или объектами. Время жизни и видимость объектов зависит от вида и места их описания и подчиняется общим правилам С++:

monstr Vasia: // Объект класса monstr с параметрами по умолчанию

monstr Super(200. 300): // Объект с явной инициализацией

monstr stado[100]: // Массив объектов с параметрами по умолчанию

monstr *beavis = new monstr (10): // Динамический объект

//(второй параметр задается по умолчанию)

monstr &butthead = Vasia: // Ссылка на объект

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

Доступ к элементам объекта аналогичен доступу к полям структуры. Для этого используются операция. (точка) при обращении к элементу через имя объекта и операция -> при обращении через указатель, например:

int п = Vasid.get_ammo();

stado[5].draw;

cout «beavis->get_health();

Обратиться таким образом можно только к элементам со спецификаторам рublic. Получить или изменить значения элементов со спецификатором private можно только через обращение к соответствующим методам.

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

К нему должны применяться только константные методы:

class monstr{

int get_health() const {return health;}

}:

const monstr Dead(Q,0); // Константный объект

cout «Dead.get_health();

Константный метод:

• объявляется с ключевым словом const после списка параметров;а не может изменять значения полей класса;

• может вызывать только константные методы;

• может вызываться для любых (не только константных) объектов.

Рекомендуется описывать как константные те методы, которые предназначены

для получения значений полей.

 

Date: 2016-07-25; view: 566; Нарушение авторских прав; Помощь в написании работы --> СЮДА...



mydocx.ru - 2015-2024 year. (0.009 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию