Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЯП все лекции.docx
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
36.41 Кб
Скачать

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

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

Объектно-ориентированное программирование основано на 3 принципах:

  1. Инкапсуляция – это объединение данных с функциями их обработки, в сочетании со скрытием ненужной для использования этих данных информацией.

Уровни доступа:

  • Public – на этом уровне осуществляется доступ из вне

  • Private – запрещен доступ из вне

  • Protected – доступ из вне к элементам класса, разрешен только классам наследника

  1. Наследование – это возможность создания иерархии классов, когда потомки наследуют все свойства своих предков и могут добавлять (изменять) и создавать новые.

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

Схема описания класса

Class <имя класса> {

[Private]

Описание полей

[Public]

описание методов

}

  1. Поля класса могут иметь любой тип, кроме типа этого же класса.

  2. Могут быть описаны с модификатором Const при этом они инициализируются только 1 раз и не могут изменяться.

  3. Поля могут быть описаны с модификатором Static (статическое поле).

Метод класса – это функция принадлежащая классу, определенная или описанная с помощью прототипов в теле класса.

Основные отличия методов класса:

  1. Имеют доступ ко всем данным класса с любым статусом, обращаться к данным метод может по имени

  2. Вызываются методы только через объект класса или через указатель, за исключением статических методов они могут вызываться без наличия объекта

Существует 2 способа определения класса:

  1. Внутреннее – при этом способе определение функции располагается в теле класса

  2. Внешнее – при этом в теле класса помещается прототип метода, а вне класса помещается прототип функции.

Пример

Class Cat {

Int Age;

Int weight;

Void Meow ( )

}

Объекты

Конкретные переменные типа класса называются экземплярами класса или объектами.

Cat Sharic

Для доступа к членам объекта используется оператор прямого доступа.

Для того чтобы присвоить возраст

Sharic.Age=12;

Заставить кошку мяукнуть

Sharic.Meow ()

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

  1. Объявляется ключевым словом Const после списка параметров

  2. Не может изменять значения полей и класса

  3. Может вызывать только константные методы

  4. Может вызываться для любых объектов

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

Class cat{

Public

Int GetAge();

Void SetAge(int age);

Void Meow();

Private

Mt itsAge;

Cat::GetAge(){

Return itsAge;

}

Cat::SetAge(integer){

Cat::Meaw(){

Cout<<Meaw”\n”;

Cin>> -ввод

Cout<< -вывод

Int main(){

Cat KASKA;

KASKA.SetAge(3);

Int main(){

Cat KASKA;

Int age;

Cin>>age;

KASKS.SetAge(age);

Coun<<”Возраст:”<<GetAge();

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

Функция создания и инициализации объектов данного класса называется конструктором

Свойства:

  1. Не возвращает значение, даже типового;

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

  3. Конструктор вызываемый без параметров наз. Конструктором по умолчанию

  4. Параметры конструктора могут иметь любой тип кроме этого же класса

  5. Если программист не указал не одного конструктора компилятор создает его автоматически

  6. Конструкторы не наследуются

  7. Конструкторы глобальных переменных вызываются до вызова функции

С помощью параметров могут быть переданы любые данные….

<имя класса>(список формальных параметров)

[операторы тела конструктора]

Деструктор – вид метода применяющийся для освобождения памяти выделенной под объект

Конструкторы могут быть 2 видов

  1. Конструктор по умолчанию, конструктором по умолчанию класса x называется такой конструктор, который не принимает никаких аргументов. X:: X()

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

Инициализация объектов класса

Существует 2 способа инициализации данных объекта с помощью конструктора

  1. Передача значений параметров тела конструктора

  2. Применение списка инициализации данных объекта

V 3d (int x1, int y1, int z1)

{ x=x1;

Y=y1;

Z=z1;

}

Class v3d {

Int x,y,z;

Public

V3d (x1,y1,z1): x(x1), y(y1), z(z1)

Деструктор – это уничтожение объекта данного класса, деструктр представляет метод с именем класса, совпадающий с именем класса перед которым стоит символ 

 v3d()

{ };

Деструктор вызывается автоматически когда объект выходит из области видимости, для локальных объектов при выходе из блоков которым они объявлены для глобальных как часть процедуры выхода из MAIN. Для объектов, заданных через указатель, деструктор вызывается неявно при использовании операции Delete.

Свойства деструктора:

  1. Не имеет аргументов

  2. Не может быть объявлен как CONST или STATIC

  3. Не наследуется

Если деструктор явным образом не определен то компилятор автоматически создает пустой деструктор

Пример

Class cat {

Public

Cat (inAge);

 Cat ();

Int GetAge();

Void SetAge (int Age);

Private

Int itsAge

}

Cat:: Cat (in Age){

ItsAge=inge;

}

Cat() {

}

Cat Kaska(5);

Наследование свойств как принцип объектно - ориентированного программирования

Объявление производного класса

Имеющийся класс – базовый, а новый класс – производный. Производные классы получают в наследство данные и методы своих базовых классов и пополняются собственными данными и методами

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

Основная форма синтаксиса объявления базового класса :

Class имя производного класса.

<ключ доступа>имя базового класса

Пример:

Class A {

-||-

}

Class B;

Public A

{

-||-

}

Инициализация наследуемых членов

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

Конструктор_производный_класс (список аргументов):

Базовый_класс1(список аргументов),…,базовый_класс n (список аргументов);

{тело конструктора}

Конструкторы базовых классов вызываются перед конструированием любых элементов производных классов

Пример: базовый класс

Class basearray {

Int maxitems;

Mt citems;

Basearray (int nitems)

{maxitems=nitems;

Citems=0;}

}

Производный класс

Class iarray=pupblic

Basearray{

int *items;

Public

Iarray(int items);

Iarray;

Int putitem (int item);

Int getitem}

Iarray:iarray(int nitems):

Basearray (nitems)

{items=new int[nitems]}

Множественное наследование

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

Пример:

Class Base1{

Int x;

Public

Base (int i) {x=I;};

}

Class Base2 {

Int x;

Public

Base2 (int i): X(i){};

}

Class TOP:Public

Base1, Public Bas<2{

Int a,b;

Public

TOP (int i, int j);

Base1(i*5),Base2(j+1);

A(i){b=j}

};

Конструкторы базового класса должны быть объявлены с атрибутами PUBLIC или PROTECTING для того чтобы обеспечить их вызов из производного класса.

Необъектное-ориентированное расширение C++

Перегрузка имен функций

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

Void print (int i);

Void print (float b);

Void print (char a);

Компилятор не различает функции по типу возвращаемого значения, поэтому перегружаемые функции не могут иметь различные типы возвращаемого значения.

Void print (int i);

Void print (float b);

int print (float a);

Динамическое распределение памятью

В С++ для динамического распределения памяти используется унарный оператор new.

Указатель на тип = new имя (инициализатор).

Оператор NEW создает в памяти объект, тип в которой определяется операнд, и возвращает указатель на этот объект.

Int * ip=new int

Это объявление создаст неинициализированный объект целого типа

Int * ip=new int (3)

Освободить память распределенную операцию NEW можно с помощью оператора DELETE IP

Память, полученная оператором NEW будет распределена до тех пор, пока она явно не будет освобождена оператором DELETE. При выходе из блока локальный указатель, содержащий адрес памяти, полученный оператором NEW уничтожается, а память остается распределенной.

В результате к этой памяти невозможно будет обратиться.

Часто NEW используется для динамического распределения памяти под массив.

Double * mas = new double(3)

Double*a;

Int n =10;

A=new double[3]

Удаление массива

Delete []a;

Ссылки

Чтобы сделать переменную ссылкой, необходимо после описателя типа поставить знак &.

Int i=3;

Int &ir=I;

Ссылка обязательно должна быть инициализирована.

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

Дружественные функции класса

Дружественность - это свойство, позволяющее отдельным функциям или методам класса использовать защищенное и приватное содержимое указанных классов.

Использование дружественности дает следующие преимущества.

  1. Облегчение работы программиста обусловлено избавлением от необходимостей продумывать способы использования закрытого содержимого класса вне этих классов.

  2. Уменьшение объема программного кода за счет использования данных классов вместо более записей методов.

  3. Временный выигрыш, связанный с тем, что обращение к данным напрямую происходит быстрее чем обращение к ним через методы

Недостатокиспользоания дружественность:

Понижение уровня защищенности объектов от некорректных действий.