Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Математические функции




C++ унаследовал из С стандартные математические функции, описание которых находится в заголовочных файлах <math.h> (<cmath>). Они позволяют получить абсолютное значение (abs, fabs), округленное число (ceil, flооr), квадратный корень (sqrt), степень (pow), значения тригонометрических функций (sin, cos, tan, sinh, cosh, tanh, asin, acos, atan, atan2), экспоненту (ехр), логарифм (log, logl0), дробную и целую части числа (modf), остаток от деления (fmod) и другие.

 

Классы

Основным "кирпичиком" ООП является класс. Класс включает набор переменных и функций для управления этими переменными. Переменные называют атрибутами {свойствами, переменными-членами или данными-членами), а функции — методами (или функциями-членами). В совокупности атрибуты и методы называются членами класса. После создания класса его название становится новым типом данных. Тем самым пользовательские классы расширяют возможности языка С++.

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

std:: string strl("Stringl"), str2("String2");

В этом примере определены два объекта strl и str2, которые являются экземлярами класса string. Каждый объект хранит информацию о своей строке, указанной при инициализации. Изменение одного объекта не затрагивает значение другого объекта. Внутри каждого объекта, незаметно для нас, производятся операции по выделению, увеличению и освобождению объема памяти, необходимого для хранения строки. Тем самым при создании объекта или его изменении нам не нужно указывать конкретный объем памяти и следить за освобождением памяти.

Чтобы иметь возможность манипулировать строкой класс string предоставляет множество методов. Например, с помощью метода size () мы получали количество символов в строке. При вызове метода его название указывается после названия объекта через точку:

std::cout «strl.size() «std::endl;

Помимо методов, класс string перегружает некоторые операторы. Например, для конкатенации используется оператор +: strl = strl + str2;

Перегрузка операторов производится с помощью методов, имеющих специальные названия. Определив в классе "операторный" метод можно изменить поведение оператора по своему вкусу. Например, перегрузив оператор + можно вместо сложения производить вычитание. Однако пользователи класса вряд ли положительно оценят такую инициативу. Тем не менее, в некоторых случаях изменение смысла оператора довольно полезно. Например, класс cout перегружает оператор побитового сдвига «для вывода данных в окно консоли.

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

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

В один прекрасный момент разработчик телевизора решает выпустить новую модель, просто добавив внутрь корпуса DVD-плеер. Большинство блоков внутри телевизора останутся от предыдущей модели. Основные изменения коснутся корпуса. Таким образом, телевизор с DVD-плеером наследует конструкцию предыдущей модели, добавляет новую функциональность (DVD-плеер) и переопределяет некоторые методы (изменяет корпус). В результате наследования в производном классе может измениться поведение какого- либо метода. Например, автобус и гусеничный трактор являются наследниками класса автомобиль, в котором определен метод, описывающий способ движения. Совершенно очевидно, что движение автобуса отличается от движения гусеничного трактора. Поэтому класс автобус может наследовать метод от класса автомобиль, не переопределяя его, а класс гусеничный трактор должен переопределить метод. Во всех этих классах теперь имеется доступ к одноименному методу, но реализация этого метода отличается. Тем не менее, этот метод выполняет одно и то же действие — движение транспортного средства. В ООП такое явление называется полиморфизмом.

Итак, мы познакомились с тремя основными понятиями ООП:

инкапсуляция — сокрытие данных внутри класса,

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

полиморфизм — смысл действия, которое выполняет одноименный метод, зависит от объекта, над которым это действие выполняется.

Объявление класса

Класс объявляется с помощью ключевого слова class по следующей схеме: class [<Название класса>] {

<Объявления закрытых членов класса>; public:

<Объявления открытых членов класса>; private:

<Объявления закрытых членов класса>; protected:

<Объявления защищенных членов класса>;}

[<Объявления переменных через запятую>];

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

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

public — открытый. Идентификатор доступен для внешнего использования,

private — закрытый. Идентификатор доступен только внутри данного класса,

protected — защищенный. Идентификатор недоступен для внешнего использования, но доступен для данного класса и для потомков этого класса.

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

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

<Название класса> <Название переменной>;

Пример одновременного объявления класса с открытыми атрибутами и переменной class Point { public: int x; int у;} point 1;

Пример отдельного объявления переменной:

Point point 2;

Обратите внимание на наличие спецификатора public. Если этот спецификатор не указан, то получить доступ к атрибутам х и у будет нельзя, так как по умолчанию члены класса являются закрытыми и доступны только внутри класса. Действие спецификатора длится до следующего спецификатора или до закрывающей фигурной скобки. В объявлении класса может быть несколько одинаковых спецификаторов. Пример: class Point { public: int x; public: int y;} point 1;

Внутри одного класса допускается использование объектов другого класса. В качестве примера объявим класс Point (точка), а затем используем его для описания координат прямоугольника внутри класса Rect (прямоугольник)

Объявление атрибутов

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

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

<Переменная>.<Название атрибута> = <3начение>;

<3начение> = <Переменная>.<Название атрибута>;

Пример: point 1.x = 10; point 1.у = 40;

std::cout «pointl.x «std::endl; // 10 std::cout «pointl.y «std::endl; // 40

В языке C++ структуры имеют функционал, аналогичный классам. Единственное отличие состоит в том, что доступ к членам структуры является открытым, а доступ к членам класса по умолчанию является закрытым. И в том и другом случае поведение по умолчанию можно изменить. Объявление структуры Point выглядит так: struct Point { // Объявление структуры и переменной int х; int у;} point;

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

<Тип данных> [<Название поля>]:<Длина в битах>;

В одном классе можно использовать одновременно битовые поля и обычные атрибуты. Обратите внимание на то, что название битового поля можно не указывать, кроме того, если длина поля составляет один бит, то перед названием поля следует указать ключевое слово unsigned. Пример объявления класса с битовыми полями: class Status { public:

unsigned:3; unsigned a:l; unsigned b:1; unsigned с:1;

} status;

Доступ к битовому полю осуществляется также как и к атрибуту класса: status.а = 1; status.b - 0; status. с = 1;

Объявление и определение методов

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

<Экземпляр класса>. <Имя метода> ([<Параметры>])

Конструкторы и деструктор

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

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

<Название класса> <Название переменной>; или так:

<Название класса> <Название переменной> = <Название класса>();

Если внутри класса объявлен пользовательский конструктор, то конструктор по умолчанию не создается. Это означает, что если вы создали конструктор с одним параметром, то при создании объекта обязательно нужно будет указывать параметр. Чтобы иметь возможность создания объекта без указания параметров следует дополнительно создать конструктор без параметров.




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


Дата добавления: 2015-05-26; Просмотров: 407; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.007 сек.