SlideShare une entreprise Scribd logo
1  sur  27
Télécharger pour lire hors ligne
Модуль 3: Основные понятия объектно-ориентированного
программирования.
Темы лекции: Продолжение введения в ООП.Перегрузка
операций.
Практическое задание: Перегрузка операций.
Тренер: Игорь Шкулипа, к.т.н.
C++ Базовый. Занятие 9
http://www.slideshare.net/IgorShkulipa 2
Продолжение введения в ООП
http://www.slideshare.net/IgorShkulipa 3
Дружественные функции
Дружественные функции – это функции, объявленные вне класса,
но имеющие доступ к закрытым и защищенным полям данного класса
Дружественная функция объявляется внутри класса с модификатором
friend
Дружественные функции не являются членами класса, поэтому им не
передается указатель this
Дружественные операции, как и дружественные функции, могут
иметь доступ к приватным и защищенным методам класса
class Class1
{
friend void FriendMethod();
};
http://www.slideshare.net/IgorShkulipa 4
Дружественные классы
Некоторым классам может понадобиться доступ к закрытым данным друг
друга.
В этом случае необходимо объявить дружественный класс внутри
определения класса
class Class1;
class Class2
{
friend class Class1;
private:
int data;
};
Дружественная связь между классами является самой сильной.
Реализации классов оказываются связанными, что противоречит
принципу инкапсуляции.
(!) Не используйте дружественные классы до тех пор, пока их
использование не окажется единственным способом решения задачи
http://www.slideshare.net/IgorShkulipa 5
Статические данные и методы
Для каждого объекта создается своя собственная копия членов данных.
Для некоторых классов было бы удобно использовать данные, общие
для всех экземпляров данного класса (например, строковое
представление имени класса или константы, общие для всех
экземпляров класса, область видимости которых должна быть
ограничена методами класса)
Такие поля и методы называют статическими и объявляют при помощи
ключевого слова static
class Class1
{
static void StaticMethod();
};
http://www.slideshare.net/IgorShkulipa 6
Особенности статических методов
◦ Статические методы не получают указатель this.
◦ Статические методы могут обращаться только к статическим данным
класса.
◦ Статические методы могут вызывать только статические методы
(либо нестатические, если им передается указатель или ссылка на
объект класса).
◦ Статические методы имеют доступ к закрытым и защищенным полям
и методам класса, через экземпляры классов.
◦ Доступ к статическим методам и данным класса осуществляется по
имени класса (создавать экземпляр не требуется).
http://www.slideshare.net/IgorShkulipa 7
Применение статических методов
◦ Паттерн «одиночка» (singleton).
◦ Объект с глобальным доступом, существующий в программе в
единственном экземпляре.
◦ Методы и данные, характерные для класса в целом, а не для
отдельных его экземпляров.
◦ Создание классов-утилит
http://www.slideshare.net/IgorShkulipa 8
Вложенное объявление классов
Язык C++ позволяет разместить объявление одного класса (или другого
типа данных) внутри объявления другого.
Это полезно, когда вложенный тип данных используется только внешним
классом, или совместно с ним.
Использование вложенного класса может происходить двумя способами:
⚫ Из методов внешнего класса – по имени вложенного класса
⚫ Снаружи – при помощи указания имени внешнего класса:
ExternalClass::InternalClass
http://www.slideshare.net/IgorShkulipa 9
Пример вложенного объявления классов
class ExternalClass
{
public:
class InternalClass
{
public: void InternalMethod();
};
private:
void ExternalMethod()
{
InternalClass inClass;
inClass.InternalMethod();
}
};
void main()
{
ExternalClass::InternalClass inClass;
inClass.InternalMethod();
}
http://www.slideshare.net/IgorShkulipa 10
Шаблоны проектирования (паттерны)
Шаблон проектирования – это архитектурная конструкция,
представляющая собой решение проблемы проектирования в
рамках некоторого часто возникающего контекста.
http://www.slideshare.net/IgorShkulipa 11
Шаблон «Одиночка» (Singleton)
#include <iostream>
using namespace std;
class Singleton
{
public:
static Singleton* GetInstance()
{
if (_instance==NULL) _instance= new Singleton();
return _instance;
}
void Method1(){cout<<"Method1n";}
void Method2(){cout<<"Method2n";}
private:
Singleton(){}
static Singleton* _instance;
};
Singleton::_instance=NULL;
int main()
{
Singleton* singleton = Singleton::GetInstance();
singleton->Method1();
singleton->Method2();
}
http://www.slideshare.net/IgorShkulipa 12
Применение Singleton
Применяется, когда нужен только один экземпляр класса.
Например для хранения глобальной конфигурации системы,
для ведения логов, связи с базой данных и т.д.
Основное преимущество перед глобальными переменными в
том, что экземпляр класса создается не при инициализации
программы, а по первому требованию.
http://www.slideshare.net/IgorShkulipa 13
Перегрузка операций
http://www.slideshare.net/IgorShkulipa 14
Для чего нужна перегрузка операций
Для некоторых типов данных естественными может оказаться
использование операций над базовыми типами:
⚫ += и + для конкатенации строк
⚫ -- и ++ для итераторов
⚫ арифметические операции для векторов и комплексных
чисел
⚫ [] для векторов и матриц
⚫ = для классов с собственным конструктором копирования
⚫ операции сравнения для строк и других типов
http://www.slideshare.net/IgorShkulipa 15
Перегрузка операций
Для пользовательских типов данных C++ позволяет задать
собственные операции
⚫ Некоторые из них всегда определяются внутри класса
⚫ =, +=, -=, *= и т.д.
⚫ Некоторые – снаружи (операции, в которых применяются
базовые типы).
⚫ Некоторые – где угодно.
Синтаксис:
<тип> operator <О>(параметры)
http://www.slideshare.net/IgorShkulipa 16
Ограничения
◦ Приоритет операций над пользовательскими типами тот же,
что и для базовых типов
◦ Нельзя переопределить операции точка (.) и sizeof
◦ Бинарные операции остаются бинарными, унарные -
унарными
http://www.slideshare.net/IgorShkulipa 17
Пример
class Complex
{
private:
double _im;
double _re;
public:
Complex();
Complex(double );
Complex(double, double);
~Complex();
}
Задача: выполнить перегрузку операций для нового типа
данных.
http://www.slideshare.net/IgorShkulipa 18
Класс «Комплексное число»
class Complex
{
private:
double _im;
double _re;
public:
Complex();
Complex(double );
Complex(double, double);
Complex (Complex &c);
~Complex();
Complex operator = (Complex &c)
{ this->SetIm(c.GetIm()); this->SetRe(c.GetRe()); return (*this); }
friend bool operator ==(const Complex& left, const Complex& right);
friend Complex operator +(const Complex& left, const Complex& right);
friend Complex operator -(const Complex& left, const Complex& right);
friend Complex operator *(const Complex& left, const Complex& right);
double GetRe(){return _re;}
double GetIm(){return _im;}
void SetRe(double re){_re=re;}
void SetIm(double im){_im=im;}
}
http://www.slideshare.net/IgorShkulipa 19
Конструкторы и деструктор
Complex::Complex()
:_re(0), _im(0)
{
}
Complex::Complex(double re)
:_re(re), _im(0)
{
}
Complex::Complex(double re, double im)
{
_re=re; _im=im;
}
Complex::Complex (Complex &c)
{
_re=c.GetRe(); _im=c.GetIm();
}
Complex::~Complex()
{
}
http://www.slideshare.net/IgorShkulipa 20
Операция сравнения
bool operator ==(const Complex& left, const Complex& right)
{
if ((left.GetRe()==right.GetRe()) &&
(left.GetIm()==right.GetIm()))
{
return true;
}
else
{
return false;
}
}
http://www.slideshare.net/IgorShkulipa 21
Арифметические операции
Complex operator +(const Complex& left, const Complex& right)
{
Complex temp;
temp.SetRe(left.GetRe() + right.GetRe());
temp.SetIm(left.GetIm() + right.GetIm());
return temp;
}
Complex operator -(const Complex& left, const Complex& right)
{
Complex temp;
temp.SetRe(left.GetRe() - right.GetRe());
temp.SetIm(left.GetIm() - right.GetIm());
return temp;
}
Complex operator *(const Complex& left, const Complex& right)
{
Complex temp;
double re=left.GetRe()*right.GetRe() – left.GetIm()*right.GetIm();
double im=left.GetRe()*right.GetRe() + left.GetIm()*right.GetIm();
temp.SetRe(re);
temp.SetIm(im);
return temp;
}
http://www.slideshare.net/IgorShkulipa 22
Потоки ввода-вывода
cin и cout - объекты классов istream (от Input Stream - поток
ввода) и ostream (от Output Stream - поток вывода)
соответственно. Именно для этих классов перегружены
операторы извлечения и вставки (<< и >>).
Базовым классом является класс ios (от Input/Output Stream -
потоковый ввод/вывод). У класса ios довольно много
производных классов.
Наследниками istream и ostream являются ifstream (от Input
File Stream) и ofstream (от Output File Stream). Которые
используются для ввода/вывода в файлы.
Кроме того, есть ещё один класс - fstream (от File Stream -
фаловый поток), в котором объединены возможности ifstream
и ofstream. fstream наследуется одновременно и от istream,
и от ostream.
http://www.slideshare.net/IgorShkulipa 23
Перегрузка операторов ввода-вывода
class Complex
{
... // Расширение класса Complex
friend ostream operator <<(ostream& out, Complex& c);
friend istream operator >>(istream& in, Complex& c);
}
ostream &operator<<(ostream &out, Complex &c)
{
if (c.GetIm()==0) out<<c.GetRe()<<“n”;
if (c.GetIm()>0) out<<c.GetRe()<<“+”<<c.GetIm()<<“i”<<“n”;
if (c.GetIm()<0) out<<c.GetRe()<<“-”<<-c.GetIm()<<“i”<<“n”;
return out;
}
istream &operator>>(istream &in, Complex &c)
{
double re, im;
in >> re >> im;
c.SetRe(re); c.SetIm(im);
return in;
}
http://www.slideshare.net/IgorShkulipa 24
Результат
#include “complex.h”
void main()
{
Complex c1(1,2);
Complex c2(2,3);
cout << c1;
cout << c2;
cin >> c1;
cin >> c2;
cout << c1+c2;
cout << c1-c2;
cout << c1*c2;
}
http://www.slideshare.net/IgorShkulipa 25
Лабораторная работа №9. Перегрузка операций
Создать класс «Вектор» произвольного размера.
Реализовать методы:
⚫ Конструкторы и деструктор
⚫ Доступа к данным
⚫ Вычисления модуля вектора
Выполнить перегрузку операций:
⚫ Сложения, вычитания, скалярного умножения векторов
⚫ Умножения вектора на скаляр
⚫ Сравнения векторов (==, !=)
⚫ Операции присваивания (=)
⚫ Операцию индексации ( [ ] )
⚫ Операции ввода-вывода
Создать приложение для демонстрации работы класса.
Меню приложения реализовать в виде класса, согласно паттерну
Singleton.
http://www.slideshare.net/IgorShkulipa 26
Бонусный слайд №1. Заголовок класса «Вектор»
class Vector {
private:
double* _data; int _size;
public:
Vector();
Vector(int);
Vector(double*, int);
Vector(Vector&);
~Vector();
Vector operator = (Vector &v) {//Код оператора}
friend bool operator ==(const Vector& left, const Vector& right);
friend bool operator !=(const Vector& left, const Vector& right);
friend Vector operator +(const Vector& left, const Vector& right);
friend Vector operator -(const Vector& left, const Vector& right);
friend double operator *(const Vector& left, const Vector& right);
friend Vector operator *(const Vector& vect, double scalar);
friend ostream operator <<(ostream& out, Vector& v);
friend istream operator >>(istream& in, Vector& v);
double operator[](int i);
int GetSize();
double* GetData();
void SetSize(int);
void SetData(double*);
}
http://www.slideshare.net/IgorShkulipa 27
Бонусный слайд №2. Операция индексации
double Vector::operator[](int i)
{
if(i<_size)
{
return _data[i];
}
else
{
return NULL;
}
}

Contenu connexe

Tendances

Java core-lect6-part3-annotation.ppt
Java core-lect6-part3-annotation.pptJava core-lect6-part3-annotation.ppt
Java core-lect6-part3-annotation.pptAnton Moiseenko
 
Java Core. Lecture# 3. Part# 1. Abstract classes.
Java Core. Lecture# 3. Part# 1. Abstract classes.Java Core. Lecture# 3. Part# 1. Abstract classes.
Java Core. Lecture# 3. Part# 1. Abstract classes.Anton Moiseenko
 
C# Desktop. Занятие 01.
C# Desktop. Занятие 01.C# Desktop. Занятие 01.
C# Desktop. Занятие 01.Igor Shkulipa
 
C++ Базовый. Занятие 17.
C++ Базовый. Занятие 17.C++ Базовый. Занятие 17.
C++ Базовый. Занятие 17.Igor Shkulipa
 
Java core-lect6-part2-reflection-api.ppt
Java core-lect6-part2-reflection-api.pptJava core-lect6-part2-reflection-api.ppt
Java core-lect6-part2-reflection-api.pptAnton Moiseenko
 
Лекция 6_принципы ООП : инкапсуляция, наследование
Лекция 6_принципы ООП : инкапсуляция, наследованиеЛекция 6_принципы ООП : инкапсуляция, наследование
Лекция 6_принципы ООП : инкапсуляция, наследованиеmetaform
 
принципы ооп и программирование классов в C#
принципы ооп и программирование классов в C#принципы ооп и программирование классов в C#
принципы ооп и программирование классов в C#bolevik
 
C++ осень 2013 лекция 5
C++ осень 2013 лекция 5C++ осень 2013 лекция 5
C++ осень 2013 лекция 5Technopark
 
Java Core. Lecture# 3. Part# 3. Multithreading.
Java Core. Lecture# 3. Part# 3. Multithreading.Java Core. Lecture# 3. Part# 3. Multithreading.
Java Core. Lecture# 3. Part# 3. Multithreading.Anton Moiseenko
 
Парадигма объектно-ориентированного программирования.
Парадигма объектно-ориентированного программирования.Парадигма объектно-ориентированного программирования.
Парадигма объектно-ориентированного программирования.Unguryan Vitaliy
 
C++ осень 2013 лекция 3
C++ осень 2013 лекция 3C++ осень 2013 лекция 3
C++ осень 2013 лекция 3Technopark
 
C++ осень 2013 лекция 7
C++ осень 2013 лекция 7C++ осень 2013 лекция 7
C++ осень 2013 лекция 7Technopark
 
Классы и объекты в Java
Классы и объекты в JavaКлассы и объекты в Java
Классы и объекты в Javametaform
 

Tendances (15)

Java core-lect6-part3-annotation.ppt
Java core-lect6-part3-annotation.pptJava core-lect6-part3-annotation.ppt
Java core-lect6-part3-annotation.ppt
 
Java Core. Lecture# 3. Part# 1. Abstract classes.
Java Core. Lecture# 3. Part# 1. Abstract classes.Java Core. Lecture# 3. Part# 1. Abstract classes.
Java Core. Lecture# 3. Part# 1. Abstract classes.
 
Классы и объекты С#
Классы и объекты С#Классы и объекты С#
Классы и объекты С#
 
C# Desktop. Занятие 01.
C# Desktop. Занятие 01.C# Desktop. Занятие 01.
C# Desktop. Занятие 01.
 
Наследование и полиморфизм
Наследование и полиморфизмНаследование и полиморфизм
Наследование и полиморфизм
 
C++ Базовый. Занятие 17.
C++ Базовый. Занятие 17.C++ Базовый. Занятие 17.
C++ Базовый. Занятие 17.
 
Java core-lect6-part2-reflection-api.ppt
Java core-lect6-part2-reflection-api.pptJava core-lect6-part2-reflection-api.ppt
Java core-lect6-part2-reflection-api.ppt
 
Лекция 6_принципы ООП : инкапсуляция, наследование
Лекция 6_принципы ООП : инкапсуляция, наследованиеЛекция 6_принципы ООП : инкапсуляция, наследование
Лекция 6_принципы ООП : инкапсуляция, наследование
 
принципы ооп и программирование классов в C#
принципы ооп и программирование классов в C#принципы ооп и программирование классов в C#
принципы ооп и программирование классов в C#
 
C++ осень 2013 лекция 5
C++ осень 2013 лекция 5C++ осень 2013 лекция 5
C++ осень 2013 лекция 5
 
Java Core. Lecture# 3. Part# 3. Multithreading.
Java Core. Lecture# 3. Part# 3. Multithreading.Java Core. Lecture# 3. Part# 3. Multithreading.
Java Core. Lecture# 3. Part# 3. Multithreading.
 
Парадигма объектно-ориентированного программирования.
Парадигма объектно-ориентированного программирования.Парадигма объектно-ориентированного программирования.
Парадигма объектно-ориентированного программирования.
 
C++ осень 2013 лекция 3
C++ осень 2013 лекция 3C++ осень 2013 лекция 3
C++ осень 2013 лекция 3
 
C++ осень 2013 лекция 7
C++ осень 2013 лекция 7C++ осень 2013 лекция 7
C++ осень 2013 лекция 7
 
Классы и объекты в Java
Классы и объекты в JavaКлассы и объекты в Java
Классы и объекты в Java
 

En vedette

Winning Strategy - APG Strategy Essentials
Winning Strategy - APG Strategy EssentialsWinning Strategy - APG Strategy Essentials
Winning Strategy - APG Strategy EssentialsChristopher Regan
 
Proyecto: Empresa beneficiada con el NAFTA
Proyecto: Empresa beneficiada con el NAFTAProyecto: Empresa beneficiada con el NAFTA
Proyecto: Empresa beneficiada con el NAFTAEdgar Ortiz
 
THE 21ST CENTURY PROJECT LEADERSHIP SUMMIT _Oct 2015
THE 21ST CENTURY PROJECT LEADERSHIP SUMMIT _Oct 2015THE 21ST CENTURY PROJECT LEADERSHIP SUMMIT _Oct 2015
THE 21ST CENTURY PROJECT LEADERSHIP SUMMIT _Oct 2015Adil Dalal
 
Planificación f
Planificación fPlanificación f
Planificación fFrida Otiz
 
Organists Review.compressed
Organists Review.compressedOrganists Review.compressed
Organists Review.compressedJamie Singleton
 
Capitulo IV análisis de resultados
Capitulo IV análisis de resultados Capitulo IV análisis de resultados
Capitulo IV análisis de resultados Ida Morán
 
Production diary 10
Production diary 10Production diary 10
Production diary 10Laila Jaleel
 
C# Web. Занятие 14.
C# Web. Занятие 14.C# Web. Занятие 14.
C# Web. Занятие 14.Igor Shkulipa
 
Production diary 5
Production diary 5Production diary 5
Production diary 5Laila Jaleel
 
amazing animals
amazing animalsamazing animals
amazing animalssosome
 
JavaScript Базовый. Занятие 06.
JavaScript Базовый. Занятие 06.JavaScript Базовый. Занятие 06.
JavaScript Базовый. Занятие 06.Igor Shkulipa
 
PPC Masters February 2015
PPC Masters February 2015PPC Masters February 2015
PPC Masters February 2015LucaSenatoreGb
 
C# Desktop. Занятие 12.
C# Desktop. Занятие 12.C# Desktop. Занятие 12.
C# Desktop. Занятие 12.Igor Shkulipa
 
C# Desktop. Занятие 09.
C# Desktop. Занятие 09.C# Desktop. Занятие 09.
C# Desktop. Занятие 09.Igor Shkulipa
 
σχέδιο προσέγγισης λογοτεχνικού κειμένου
σχέδιο προσέγγισης λογοτεχνικού κειμένουσχέδιο προσέγγισης λογοτεχνικού κειμένου
σχέδιο προσέγγισης λογοτεχνικού κειμένουMANOLIS MORAITIS
 

En vedette (20)

Winning Strategy - APG Strategy Essentials
Winning Strategy - APG Strategy EssentialsWinning Strategy - APG Strategy Essentials
Winning Strategy - APG Strategy Essentials
 
CV_Rakesh
CV_RakeshCV_Rakesh
CV_Rakesh
 
Proyecto: Empresa beneficiada con el NAFTA
Proyecto: Empresa beneficiada con el NAFTAProyecto: Empresa beneficiada con el NAFTA
Proyecto: Empresa beneficiada con el NAFTA
 
THE 21ST CENTURY PROJECT LEADERSHIP SUMMIT _Oct 2015
THE 21ST CENTURY PROJECT LEADERSHIP SUMMIT _Oct 2015THE 21ST CENTURY PROJECT LEADERSHIP SUMMIT _Oct 2015
THE 21ST CENTURY PROJECT LEADERSHIP SUMMIT _Oct 2015
 
VAElectionsPaper
VAElectionsPaperVAElectionsPaper
VAElectionsPaper
 
Planificación f
Planificación fPlanificación f
Planificación f
 
Organists Review.compressed
Organists Review.compressedOrganists Review.compressed
Organists Review.compressed
 
Capitulo IV análisis de resultados
Capitulo IV análisis de resultados Capitulo IV análisis de resultados
Capitulo IV análisis de resultados
 
Production diary 10
Production diary 10Production diary 10
Production diary 10
 
C# Web. Занятие 14.
C# Web. Занятие 14.C# Web. Занятие 14.
C# Web. Занятие 14.
 
Production diary 5
Production diary 5Production diary 5
Production diary 5
 
amazing animals
amazing animalsamazing animals
amazing animals
 
Print Brochure 3NM v6
Print Brochure 3NM v6Print Brochure 3NM v6
Print Brochure 3NM v6
 
JavaScript Базовый. Занятие 06.
JavaScript Базовый. Занятие 06.JavaScript Базовый. Занятие 06.
JavaScript Базовый. Занятие 06.
 
CV
CVCV
CV
 
objetos
objetosobjetos
objetos
 
PPC Masters February 2015
PPC Masters February 2015PPC Masters February 2015
PPC Masters February 2015
 
C# Desktop. Занятие 12.
C# Desktop. Занятие 12.C# Desktop. Занятие 12.
C# Desktop. Занятие 12.
 
C# Desktop. Занятие 09.
C# Desktop. Занятие 09.C# Desktop. Занятие 09.
C# Desktop. Занятие 09.
 
σχέδιο προσέγγισης λογοτεχνικού κειμένου
σχέδιο προσέγγισης λογοτεχνικού κειμένουσχέδιο προσέγγισης λογοτεχνικού κειμένου
σχέδιο προσέγγισης λογοτεχνικού κειμένου
 

Similaire à C++ Базовый. Занятие 09.

C++ осень 2012 лекция 9
C++ осень 2012 лекция 9C++ осень 2012 лекция 9
C++ осень 2012 лекция 9Technopark
 
C# Desktop. Занятие 02.
C# Desktop. Занятие 02.C# Desktop. Занятие 02.
C# Desktop. Занятие 02.Igor Shkulipa
 
C++ осень 2012 лекция 3
C++ осень 2012 лекция 3C++ осень 2012 лекция 3
C++ осень 2012 лекция 3Technopark
 
Lec 2 Java
Lec 2 JavaLec 2 Java
Lec 2 Javaitc73
 
Master class bars group ext js4
Master class bars group   ext js4Master class bars group   ext js4
Master class bars group ext js4Radik Fattakhov
 
C# Desktop. Занятие 07.
C# Desktop. Занятие 07.C# Desktop. Занятие 07.
C# Desktop. Занятие 07.Igor Shkulipa
 
углубленное программирование на C++. лекция no.5 [4.0]
углубленное программирование на C++. лекция no.5 [4.0]углубленное программирование на C++. лекция no.5 [4.0]
углубленное программирование на C++. лекция no.5 [4.0]Technopark
 
C++ осень 2012 лекция 6
C++ осень 2012 лекция 6C++ осень 2012 лекция 6
C++ осень 2012 лекция 6Technopark
 
Android - 02 - annotations, exceptions, io, generics
Android - 02 - annotations, exceptions, io, genericsAndroid - 02 - annotations, exceptions, io, generics
Android - 02 - annotations, exceptions, io, genericsNoveo
 
Общие темы. Тема 02.
Общие темы. Тема 02.Общие темы. Тема 02.
Общие темы. Тема 02.Igor Shkulipa
 
C++ осень 2013 лекция 4
C++ осень 2013 лекция 4C++ осень 2013 лекция 4
C++ осень 2013 лекция 4Technopark
 
Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование Sergey Schetinin
 
C++ весна 2014 лекция 5
C++ весна 2014 лекция 5C++ весна 2014 лекция 5
C++ весна 2014 лекция 5Technopark
 
C++ осень 2013 лекция 9
C++ осень 2013 лекция 9C++ осень 2013 лекция 9
C++ осень 2013 лекция 9Technopark
 
C# Desktop. Занятие 06.
C# Desktop. Занятие 06.C# Desktop. Занятие 06.
C# Desktop. Занятие 06.Igor Shkulipa
 
Java осень 2014 занятие 5
Java осень 2014 занятие 5Java осень 2014 занятие 5
Java осень 2014 занятие 5Technopark
 

Similaire à C++ Базовый. Занятие 09. (20)

C++ осень 2012 лекция 9
C++ осень 2012 лекция 9C++ осень 2012 лекция 9
C++ осень 2012 лекция 9
 
C# Desktop. Занятие 02.
C# Desktop. Занятие 02.C# Desktop. Занятие 02.
C# Desktop. Занятие 02.
 
C++ осень 2012 лекция 3
C++ осень 2012 лекция 3C++ осень 2012 лекция 3
C++ осень 2012 лекция 3
 
Lec 2 Java
Lec 2 JavaLec 2 Java
Lec 2 Java
 
Lec 2
Lec 2Lec 2
Lec 2
 
Master class bars group ext js4
Master class bars group   ext js4Master class bars group   ext js4
Master class bars group ext js4
 
C# Desktop. Занятие 07.
C# Desktop. Занятие 07.C# Desktop. Занятие 07.
C# Desktop. Занятие 07.
 
Bytecode
BytecodeBytecode
Bytecode
 
углубленное программирование на C++. лекция no.5 [4.0]
углубленное программирование на C++. лекция no.5 [4.0]углубленное программирование на C++. лекция no.5 [4.0]
углубленное программирование на C++. лекция no.5 [4.0]
 
C++ осень 2012 лекция 6
C++ осень 2012 лекция 6C++ осень 2012 лекция 6
C++ осень 2012 лекция 6
 
Android - 02 - annotations, exceptions, io, generics
Android - 02 - annotations, exceptions, io, genericsAndroid - 02 - annotations, exceptions, io, generics
Android - 02 - annotations, exceptions, io, generics
 
Zend Framework и Doctrine
Zend Framework и DoctrineZend Framework и Doctrine
Zend Framework и Doctrine
 
Общие темы. Тема 02.
Общие темы. Тема 02.Общие темы. Тема 02.
Общие темы. Тема 02.
 
C++ осень 2013 лекция 4
C++ осень 2013 лекция 4C++ осень 2013 лекция 4
C++ осень 2013 лекция 4
 
Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование
 
C++ весна 2014 лекция 5
C++ весна 2014 лекция 5C++ весна 2014 лекция 5
C++ весна 2014 лекция 5
 
C++ осень 2013 лекция 9
C++ осень 2013 лекция 9C++ осень 2013 лекция 9
C++ осень 2013 лекция 9
 
C# Desktop. Занятие 06.
C# Desktop. Занятие 06.C# Desktop. Занятие 06.
C# Desktop. Занятие 06.
 
Java осень 2014 занятие 5
Java осень 2014 занятие 5Java осень 2014 занятие 5
Java осень 2014 занятие 5
 
Step 3.2
Step 3.2Step 3.2
Step 3.2
 

Plus de Igor Shkulipa

Общие темы. Тема 03.
Общие темы. Тема 03. Общие темы. Тема 03.
Общие темы. Тема 03. Igor Shkulipa
 
Общие темы. Тема 01.
Общие темы. Тема 01.Общие темы. Тема 01.
Общие темы. Тема 01.Igor Shkulipa
 
JavaScript Базовый. Занятие 11.
JavaScript Базовый. Занятие 11.JavaScript Базовый. Занятие 11.
JavaScript Базовый. Занятие 11.Igor Shkulipa
 
JavaScript Базовый. Занятие 09.
JavaScript Базовый. Занятие 09.JavaScript Базовый. Занятие 09.
JavaScript Базовый. Занятие 09.Igor Shkulipa
 
JavaScript Базовый. Занятие 10.
JavaScript Базовый. Занятие 10.JavaScript Базовый. Занятие 10.
JavaScript Базовый. Занятие 10.Igor Shkulipa
 
JavaScript Базовый. Занятие 05.
JavaScript Базовый. Занятие 05.JavaScript Базовый. Занятие 05.
JavaScript Базовый. Занятие 05.Igor Shkulipa
 
JavaScript Базовый. Занятие 08.
JavaScript Базовый. Занятие 08.JavaScript Базовый. Занятие 08.
JavaScript Базовый. Занятие 08.Igor Shkulipa
 
JavaScript Базовый. Занятие 07.
JavaScript Базовый. Занятие 07.JavaScript Базовый. Занятие 07.
JavaScript Базовый. Занятие 07.Igor Shkulipa
 
JavaScript Базовый. Занятие 01.
JavaScript Базовый. Занятие 01.JavaScript Базовый. Занятие 01.
JavaScript Базовый. Занятие 01.Igor Shkulipa
 
JavaScript Базовый. Занятие 04.
JavaScript Базовый. Занятие 04.JavaScript Базовый. Занятие 04.
JavaScript Базовый. Занятие 04.Igor Shkulipa
 
JavaScript Базовый. Занятие 03.
JavaScript Базовый. Занятие 03.JavaScript Базовый. Занятие 03.
JavaScript Базовый. Занятие 03.Igor Shkulipa
 
JavaScript Базовый. Занятие 02.
JavaScript Базовый. Занятие 02.JavaScript Базовый. Занятие 02.
JavaScript Базовый. Занятие 02.Igor Shkulipa
 
C# Web. Занятие 09.
C# Web. Занятие 09.C# Web. Занятие 09.
C# Web. Занятие 09.Igor Shkulipa
 
C# Web. Занятие 08.
C# Web. Занятие 08.C# Web. Занятие 08.
C# Web. Занятие 08.Igor Shkulipa
 
C# Web. Занятие 07.
C# Web. Занятие 07.C# Web. Занятие 07.
C# Web. Занятие 07.Igor Shkulipa
 
C# Web. Занятие 04.
C# Web. Занятие 04.C# Web. Занятие 04.
C# Web. Занятие 04.Igor Shkulipa
 
C# Web. Занятие 12.
C# Web. Занятие 12.C# Web. Занятие 12.
C# Web. Занятие 12.Igor Shkulipa
 
C# Web. Занятие 16.
C# Web. Занятие 16.C# Web. Занятие 16.
C# Web. Занятие 16.Igor Shkulipa
 
C# Web. Занятие 15.
C# Web. Занятие 15.C# Web. Занятие 15.
C# Web. Занятие 15.Igor Shkulipa
 
C# Web. Занятие 13.
C# Web. Занятие 13.C# Web. Занятие 13.
C# Web. Занятие 13.Igor Shkulipa
 

Plus de Igor Shkulipa (20)

Общие темы. Тема 03.
Общие темы. Тема 03. Общие темы. Тема 03.
Общие темы. Тема 03.
 
Общие темы. Тема 01.
Общие темы. Тема 01.Общие темы. Тема 01.
Общие темы. Тема 01.
 
JavaScript Базовый. Занятие 11.
JavaScript Базовый. Занятие 11.JavaScript Базовый. Занятие 11.
JavaScript Базовый. Занятие 11.
 
JavaScript Базовый. Занятие 09.
JavaScript Базовый. Занятие 09.JavaScript Базовый. Занятие 09.
JavaScript Базовый. Занятие 09.
 
JavaScript Базовый. Занятие 10.
JavaScript Базовый. Занятие 10.JavaScript Базовый. Занятие 10.
JavaScript Базовый. Занятие 10.
 
JavaScript Базовый. Занятие 05.
JavaScript Базовый. Занятие 05.JavaScript Базовый. Занятие 05.
JavaScript Базовый. Занятие 05.
 
JavaScript Базовый. Занятие 08.
JavaScript Базовый. Занятие 08.JavaScript Базовый. Занятие 08.
JavaScript Базовый. Занятие 08.
 
JavaScript Базовый. Занятие 07.
JavaScript Базовый. Занятие 07.JavaScript Базовый. Занятие 07.
JavaScript Базовый. Занятие 07.
 
JavaScript Базовый. Занятие 01.
JavaScript Базовый. Занятие 01.JavaScript Базовый. Занятие 01.
JavaScript Базовый. Занятие 01.
 
JavaScript Базовый. Занятие 04.
JavaScript Базовый. Занятие 04.JavaScript Базовый. Занятие 04.
JavaScript Базовый. Занятие 04.
 
JavaScript Базовый. Занятие 03.
JavaScript Базовый. Занятие 03.JavaScript Базовый. Занятие 03.
JavaScript Базовый. Занятие 03.
 
JavaScript Базовый. Занятие 02.
JavaScript Базовый. Занятие 02.JavaScript Базовый. Занятие 02.
JavaScript Базовый. Занятие 02.
 
C# Web. Занятие 09.
C# Web. Занятие 09.C# Web. Занятие 09.
C# Web. Занятие 09.
 
C# Web. Занятие 08.
C# Web. Занятие 08.C# Web. Занятие 08.
C# Web. Занятие 08.
 
C# Web. Занятие 07.
C# Web. Занятие 07.C# Web. Занятие 07.
C# Web. Занятие 07.
 
C# Web. Занятие 04.
C# Web. Занятие 04.C# Web. Занятие 04.
C# Web. Занятие 04.
 
C# Web. Занятие 12.
C# Web. Занятие 12.C# Web. Занятие 12.
C# Web. Занятие 12.
 
C# Web. Занятие 16.
C# Web. Занятие 16.C# Web. Занятие 16.
C# Web. Занятие 16.
 
C# Web. Занятие 15.
C# Web. Занятие 15.C# Web. Занятие 15.
C# Web. Занятие 15.
 
C# Web. Занятие 13.
C# Web. Занятие 13.C# Web. Занятие 13.
C# Web. Занятие 13.
 

C++ Базовый. Занятие 09.

  • 1. Модуль 3: Основные понятия объектно-ориентированного программирования. Темы лекции: Продолжение введения в ООП.Перегрузка операций. Практическое задание: Перегрузка операций. Тренер: Игорь Шкулипа, к.т.н. C++ Базовый. Занятие 9
  • 3. http://www.slideshare.net/IgorShkulipa 3 Дружественные функции Дружественные функции – это функции, объявленные вне класса, но имеющие доступ к закрытым и защищенным полям данного класса Дружественная функция объявляется внутри класса с модификатором friend Дружественные функции не являются членами класса, поэтому им не передается указатель this Дружественные операции, как и дружественные функции, могут иметь доступ к приватным и защищенным методам класса class Class1 { friend void FriendMethod(); };
  • 4. http://www.slideshare.net/IgorShkulipa 4 Дружественные классы Некоторым классам может понадобиться доступ к закрытым данным друг друга. В этом случае необходимо объявить дружественный класс внутри определения класса class Class1; class Class2 { friend class Class1; private: int data; }; Дружественная связь между классами является самой сильной. Реализации классов оказываются связанными, что противоречит принципу инкапсуляции. (!) Не используйте дружественные классы до тех пор, пока их использование не окажется единственным способом решения задачи
  • 5. http://www.slideshare.net/IgorShkulipa 5 Статические данные и методы Для каждого объекта создается своя собственная копия членов данных. Для некоторых классов было бы удобно использовать данные, общие для всех экземпляров данного класса (например, строковое представление имени класса или константы, общие для всех экземпляров класса, область видимости которых должна быть ограничена методами класса) Такие поля и методы называют статическими и объявляют при помощи ключевого слова static class Class1 { static void StaticMethod(); };
  • 6. http://www.slideshare.net/IgorShkulipa 6 Особенности статических методов ◦ Статические методы не получают указатель this. ◦ Статические методы могут обращаться только к статическим данным класса. ◦ Статические методы могут вызывать только статические методы (либо нестатические, если им передается указатель или ссылка на объект класса). ◦ Статические методы имеют доступ к закрытым и защищенным полям и методам класса, через экземпляры классов. ◦ Доступ к статическим методам и данным класса осуществляется по имени класса (создавать экземпляр не требуется).
  • 7. http://www.slideshare.net/IgorShkulipa 7 Применение статических методов ◦ Паттерн «одиночка» (singleton). ◦ Объект с глобальным доступом, существующий в программе в единственном экземпляре. ◦ Методы и данные, характерные для класса в целом, а не для отдельных его экземпляров. ◦ Создание классов-утилит
  • 8. http://www.slideshare.net/IgorShkulipa 8 Вложенное объявление классов Язык C++ позволяет разместить объявление одного класса (или другого типа данных) внутри объявления другого. Это полезно, когда вложенный тип данных используется только внешним классом, или совместно с ним. Использование вложенного класса может происходить двумя способами: ⚫ Из методов внешнего класса – по имени вложенного класса ⚫ Снаружи – при помощи указания имени внешнего класса: ExternalClass::InternalClass
  • 9. http://www.slideshare.net/IgorShkulipa 9 Пример вложенного объявления классов class ExternalClass { public: class InternalClass { public: void InternalMethod(); }; private: void ExternalMethod() { InternalClass inClass; inClass.InternalMethod(); } }; void main() { ExternalClass::InternalClass inClass; inClass.InternalMethod(); }
  • 10. http://www.slideshare.net/IgorShkulipa 10 Шаблоны проектирования (паттерны) Шаблон проектирования – это архитектурная конструкция, представляющая собой решение проблемы проектирования в рамках некоторого часто возникающего контекста.
  • 11. http://www.slideshare.net/IgorShkulipa 11 Шаблон «Одиночка» (Singleton) #include <iostream> using namespace std; class Singleton { public: static Singleton* GetInstance() { if (_instance==NULL) _instance= new Singleton(); return _instance; } void Method1(){cout<<"Method1n";} void Method2(){cout<<"Method2n";} private: Singleton(){} static Singleton* _instance; }; Singleton::_instance=NULL; int main() { Singleton* singleton = Singleton::GetInstance(); singleton->Method1(); singleton->Method2(); }
  • 12. http://www.slideshare.net/IgorShkulipa 12 Применение Singleton Применяется, когда нужен только один экземпляр класса. Например для хранения глобальной конфигурации системы, для ведения логов, связи с базой данных и т.д. Основное преимущество перед глобальными переменными в том, что экземпляр класса создается не при инициализации программы, а по первому требованию.
  • 14. http://www.slideshare.net/IgorShkulipa 14 Для чего нужна перегрузка операций Для некоторых типов данных естественными может оказаться использование операций над базовыми типами: ⚫ += и + для конкатенации строк ⚫ -- и ++ для итераторов ⚫ арифметические операции для векторов и комплексных чисел ⚫ [] для векторов и матриц ⚫ = для классов с собственным конструктором копирования ⚫ операции сравнения для строк и других типов
  • 15. http://www.slideshare.net/IgorShkulipa 15 Перегрузка операций Для пользовательских типов данных C++ позволяет задать собственные операции ⚫ Некоторые из них всегда определяются внутри класса ⚫ =, +=, -=, *= и т.д. ⚫ Некоторые – снаружи (операции, в которых применяются базовые типы). ⚫ Некоторые – где угодно. Синтаксис: <тип> operator <О>(параметры)
  • 16. http://www.slideshare.net/IgorShkulipa 16 Ограничения ◦ Приоритет операций над пользовательскими типами тот же, что и для базовых типов ◦ Нельзя переопределить операции точка (.) и sizeof ◦ Бинарные операции остаются бинарными, унарные - унарными
  • 17. http://www.slideshare.net/IgorShkulipa 17 Пример class Complex { private: double _im; double _re; public: Complex(); Complex(double ); Complex(double, double); ~Complex(); } Задача: выполнить перегрузку операций для нового типа данных.
  • 18. http://www.slideshare.net/IgorShkulipa 18 Класс «Комплексное число» class Complex { private: double _im; double _re; public: Complex(); Complex(double ); Complex(double, double); Complex (Complex &c); ~Complex(); Complex operator = (Complex &c) { this->SetIm(c.GetIm()); this->SetRe(c.GetRe()); return (*this); } friend bool operator ==(const Complex& left, const Complex& right); friend Complex operator +(const Complex& left, const Complex& right); friend Complex operator -(const Complex& left, const Complex& right); friend Complex operator *(const Complex& left, const Complex& right); double GetRe(){return _re;} double GetIm(){return _im;} void SetRe(double re){_re=re;} void SetIm(double im){_im=im;} }
  • 19. http://www.slideshare.net/IgorShkulipa 19 Конструкторы и деструктор Complex::Complex() :_re(0), _im(0) { } Complex::Complex(double re) :_re(re), _im(0) { } Complex::Complex(double re, double im) { _re=re; _im=im; } Complex::Complex (Complex &c) { _re=c.GetRe(); _im=c.GetIm(); } Complex::~Complex() { }
  • 20. http://www.slideshare.net/IgorShkulipa 20 Операция сравнения bool operator ==(const Complex& left, const Complex& right) { if ((left.GetRe()==right.GetRe()) && (left.GetIm()==right.GetIm())) { return true; } else { return false; } }
  • 21. http://www.slideshare.net/IgorShkulipa 21 Арифметические операции Complex operator +(const Complex& left, const Complex& right) { Complex temp; temp.SetRe(left.GetRe() + right.GetRe()); temp.SetIm(left.GetIm() + right.GetIm()); return temp; } Complex operator -(const Complex& left, const Complex& right) { Complex temp; temp.SetRe(left.GetRe() - right.GetRe()); temp.SetIm(left.GetIm() - right.GetIm()); return temp; } Complex operator *(const Complex& left, const Complex& right) { Complex temp; double re=left.GetRe()*right.GetRe() – left.GetIm()*right.GetIm(); double im=left.GetRe()*right.GetRe() + left.GetIm()*right.GetIm(); temp.SetRe(re); temp.SetIm(im); return temp; }
  • 22. http://www.slideshare.net/IgorShkulipa 22 Потоки ввода-вывода cin и cout - объекты классов istream (от Input Stream - поток ввода) и ostream (от Output Stream - поток вывода) соответственно. Именно для этих классов перегружены операторы извлечения и вставки (<< и >>). Базовым классом является класс ios (от Input/Output Stream - потоковый ввод/вывод). У класса ios довольно много производных классов. Наследниками istream и ostream являются ifstream (от Input File Stream) и ofstream (от Output File Stream). Которые используются для ввода/вывода в файлы. Кроме того, есть ещё один класс - fstream (от File Stream - фаловый поток), в котором объединены возможности ifstream и ofstream. fstream наследуется одновременно и от istream, и от ostream.
  • 23. http://www.slideshare.net/IgorShkulipa 23 Перегрузка операторов ввода-вывода class Complex { ... // Расширение класса Complex friend ostream operator <<(ostream& out, Complex& c); friend istream operator >>(istream& in, Complex& c); } ostream &operator<<(ostream &out, Complex &c) { if (c.GetIm()==0) out<<c.GetRe()<<“n”; if (c.GetIm()>0) out<<c.GetRe()<<“+”<<c.GetIm()<<“i”<<“n”; if (c.GetIm()<0) out<<c.GetRe()<<“-”<<-c.GetIm()<<“i”<<“n”; return out; } istream &operator>>(istream &in, Complex &c) { double re, im; in >> re >> im; c.SetRe(re); c.SetIm(im); return in; }
  • 24. http://www.slideshare.net/IgorShkulipa 24 Результат #include “complex.h” void main() { Complex c1(1,2); Complex c2(2,3); cout << c1; cout << c2; cin >> c1; cin >> c2; cout << c1+c2; cout << c1-c2; cout << c1*c2; }
  • 25. http://www.slideshare.net/IgorShkulipa 25 Лабораторная работа №9. Перегрузка операций Создать класс «Вектор» произвольного размера. Реализовать методы: ⚫ Конструкторы и деструктор ⚫ Доступа к данным ⚫ Вычисления модуля вектора Выполнить перегрузку операций: ⚫ Сложения, вычитания, скалярного умножения векторов ⚫ Умножения вектора на скаляр ⚫ Сравнения векторов (==, !=) ⚫ Операции присваивания (=) ⚫ Операцию индексации ( [ ] ) ⚫ Операции ввода-вывода Создать приложение для демонстрации работы класса. Меню приложения реализовать в виде класса, согласно паттерну Singleton.
  • 26. http://www.slideshare.net/IgorShkulipa 26 Бонусный слайд №1. Заголовок класса «Вектор» class Vector { private: double* _data; int _size; public: Vector(); Vector(int); Vector(double*, int); Vector(Vector&); ~Vector(); Vector operator = (Vector &v) {//Код оператора} friend bool operator ==(const Vector& left, const Vector& right); friend bool operator !=(const Vector& left, const Vector& right); friend Vector operator +(const Vector& left, const Vector& right); friend Vector operator -(const Vector& left, const Vector& right); friend double operator *(const Vector& left, const Vector& right); friend Vector operator *(const Vector& vect, double scalar); friend ostream operator <<(ostream& out, Vector& v); friend istream operator >>(istream& in, Vector& v); double operator[](int i); int GetSize(); double* GetData(); void SetSize(int); void SetData(double*); }
  • 27. http://www.slideshare.net/IgorShkulipa 27 Бонусный слайд №2. Операция индексации double Vector::operator[](int i) { if(i<_size) { return _data[i]; } else { return NULL; } }