ООП Классы – 2. Ссылки Ссылка – еще одно имя объекта. Используйте ссылки вместо указателя. Это более безопасно. Complex c(10,10); Complex c2& = c; c2+=10;

Slides:



Advertisements
Similar presentations
Complete Structure class Date {class Date { private :private : // private data and functions// private data and functions public :public : // public data.
Advertisements

Operator overloading redefine the operations of operators
EXtreme Programming XP Тема 3. XP Пусть есть некоторая информационная система для банков. В качестве основной валюты для расчетов используется доллар,
SharePoint 2013 apps to be or not to be. Alexander Krupsky Artur Kukharevich.
Overloading Operators Overloading operators Unary operators Binary operators Member, non-member operators Friend functions and classes Function templates.
Introduction to Programming Lecture 31. Operator Overloading.
ЗАРЯДКА НА АНГЛИЙСКОМ ЯЗЫКЕ.  Зарядка на уроке английского языка может стать самым любимым и веселым занятием для детей, при том, что она проходит исключительно.
ООП Классы. Данные отдельно, методы отдельно struct Node { Node* next; void* data; }; struct List { Node* first; int size; }; void* allocate() { … } void.
Автоматическая генерация кода программ с явным выделением состояний Канжелев С.Ю. магистрант СПбГУ ИТМО Шалыто А.А. доктор технических наук профессор СПбГУ.
Системы отбора. Условные обозначения (1) (2) (3) (4) (5) (6) (7) Математическое моделирование процессов отбора2.
Problem: Given an array of positive integers, find a pair of integers in the array that adds up to 10 (or indicate none exist). Your code should be as.
Тема урока: Взаимно обратные числа 6 класс. Цели урока: вввести понятие взаимно обратных чисел; ссформировать умение находить взаимно обратные числа.
ЭЛЕКТРОННЫЙ ХРОНОМЕТРАЖ Докладчики : Чуранов В. Л. ( Вологда ) Цапилов Н. В. ( Рыбинск )
Скриптовые языки на примере Perl. Языки программирования Скриптовые Программа (или ее бай-код) интерпретируется Зачастую более высокий уровень абстрагирования.
Class template Describing a generic class Instantiating classes that are type-specific version of this generic class Also are called parameterized types.
Делегаты. Как созданные объекты могут посылать сообщения тем объектам, которые их породили? При программировании под Windows на С и C++ основное средство.
Особенности Java. Блок static static { } Создание и уничтожение объектов  new – создание объекта  finalyze()
Язык JavaScript Скриптовый язык для выполнения на html-страницах.
Номинация «Лучшее предложение по развитию массового спорта» «Строительство Роллердрома в городе Челябинск» Предложение подготовлено: Бобковой Екатериной.
Язык SmallTalk «Чистый» объектно- ориентированный язык.
Анатомия класса. Схожесть с др. языками   С# похож на язык Java в том, что он требует, чтобы вся программная логика была заключена в определения типов.
Growing Neural Gas Method Нейросетевой метод построения неструктурированных адаптивных сеток.
"The European Molecular Biology Open Software Suite"
Формантный синтезатор речи. Часть 1. Полюсы и нули – иное понимание Полюс – это пара чисел (B, F), B – ширина форманты, F – частота форманты Нуль – это.
ADT Specification Example
Синтаксис языка Java.
Пользовательские действия (custom actions) в JSP. JSTL.
Особенности языка JavaScript и его использования.
Наследование и полиморфизм. «Быть» или «Иметь» а так же «Точно» или «Как получится»
Коллекции. Пространство имен System.Collections Наиболее простой вариант набора элементов — это массив System. Array. Он уже обладает весьма полезными.
Формы в HTML. Элемент FORM Элемент уровня «блок» Управляющие элементы Просто текст Атрибуты: action – url обработчика method – post или get enctype –
ВВЕДЕНИЕ В ВЫЧИСЛИТЕЛЬНУЮ МАТЕМАТИКУ Лекция 5 6 октября 2009 ВЫЧИСЛИТЕЛЬНАЯ ЛИНЕЙНАЯ АЛГЕБРА.
Обработка исключений в C# Единая техника обнаружения ошибок времени выполнения и передачи информации о них.
OAUTHОРИЗАЦИЯ И API СОЦИАЛЬНЫХ СЕТЕЙ Артём Курапов.
Нескучное тестирование с pytest
Подход к реализации XQuery Паращенко Олег Санкт-Петербургский Государственный Университет Обнинск, 2004.
1 Учебный курс Введение в JavaScript и CGI Лекция 4 Работа с графикой, гипертекстовые переходы и синтаксис языка кандидат технических наук Павел Брониславович.
1 R E F R I G E R A T I O N A N D A I R C O N D I T I O N I N G Как обновить программное обеспечение в AK-SC 255.
Board Games. KnowWant to knowLearnt jigsawpuzzle adominoesyrw cfeukoloased hdscrabbleja eetashiefyjr sfmarblesaet sokbilliards ybackgammonu.
Объектные интерфейсы (.NET) «Школа Инноваций InterSystems 2007»
Язык программирования C#
КРУПНЕЙШАЯ ТЕХНИЧЕСКАЯ КОНФЕРЕНЦИЯ MICROSOFT В УКРАИНЕ Metro приложения: работа с данными Краковецкий Александр, MVP/RD/PhD. DevRain Solutions.
Microsoft TechDayshttp:// Алексей Вихарев Microsoft Certified Trainer.
J. P. Cohoon and J. W. Davidson © 1997 McGraw-Hill, Inc. Templates Generic functions and classes.
Человеко-машинное взаимодействие Лекция 6 Мерзлякова Екатерина Юрьевна к.т.н. доцент ПМиК.
Saint Petersburg, 2011 Java Lecture Generics. Quiz ArrayList lst = new ArrayList(); Collection c = lst; lst.add("one"); lst.add(“two"); lst.add(“three");
HTTP ANDROID CLUB 2015.
51) [Serializable] public class UserPrefs { public string WindowColor; public int FontSize; } 52) Листинг static void Main(string[] args) { UserPrefs.
MASTERING NAMESPACES! Илья Кантор EcmaScript 5.
Anekdot ANDROID CLUB Сегодня  Navigation Drawer  CardView  Calligraphy  TextToSpeech.
1) int i = int.Parse("99"); 2) delegate void IntMethodInvoker(uint x); 3) delegate double TwoLongsOp(long first, long second); 4) delegate string GetAString();
Const Member Functions Which are read-only? //fraction.h... class Fraction { public: void readin(); void print();
ICOM 4035 – Data Structures Dr. Manuel Rodríguez Martínez Electrical and Computer Engineering Department.
Стеки и очереди 1. Абстрактный стек public interface Stack { static class Underflow extends Exception { public Underflow() { super("Stack underflow");
Activity ANDROID CLUB Сегодня  Основные компоненты Android  Activity  Layout для Activity  Создание Activity  Launcher Activity  Activity.
Int fact (int n) { If (n == 0) return 1; else return n * fact (n – 1); } 5 void main () { Int Sum; : Sum = fact (5); : } Factorial Program Using Recursion.
 Binary operators  Unary operators  Conversion Operators  Proxy Classes (simulating a reference) ▪ bitset example  Special operators  Indexing 
‘For and Against’ Essays Useful tips. Plan Introduction - Paragraph 1 (state topic – summary of the topic without giving your opinion) Main Body – Paragraph.
OpenCL С. OpenCL и CUDA CUDAOpenCL Kernel Host program ThreadWork item BlockWork group GridNDRange WarpWavefront.
Reasoning with invariants
Developed By : Ms. K. S. Kotecha
null, true, and false are also reserved.
Object-Oriented Programming (OOP) Lecture No. 39
Working With Arrays.
COMPUTER 2430 Object Oriented Programming and Data Structures I
Example. Sort {5, 1, 12, -5, 16, 2, 12, 14} using selection sort. Complexity analysis.
Сортировка, поиск и фильтрация данных в базе данных и выборках
Шаблоны.
Introduction to Programming
* Любой табак кроме WTO Депозит берется в течение 20 мин, как подошли все гости* В депозит входят все позиции в меню* Депозит не возвращается*
Presentation transcript:

ООП Классы – 2

Ссылки Ссылка – еще одно имя объекта. Используйте ссылки вместо указателя. Это более безопасно. Complex c(10,10); Complex c2& = c; c2+=10; // изменяется c Complex c3&; // нельзя, имя есть, а самого объекта нет Complex c4* = &c2; // c4 указывает на с, т.к. &c2 == &c void swap(int a, int b) { // не работает, приходят копии объектов int tmp = a; a = b; b = tmp; } void swap(int& a, int& b) { // работает, приходят сами объекты int tmp = a; a = b; b = tmp; } Пример вызова: int a=10, b = 15; swap (a, b);

Ключевое слово this Указатель this доступен внутри метода объекта. Он указывает на сам объект, для которого вызван метод. Например: class Complex { private: float real, image; public: float getReal() { return this->real; // тоже самое, что и return real; } Пример использования: class Complex { private: float real, image; public: Complex& operator+=(const Complex& obj) { real += obj.real; image = obj.image; return *this; } void main() { Complex c1(1,1), c2(2,2), c3(3,3); c1+=c2+=c3; // c2 станет (5,5), а с1 станет (6,6) }

Проблема: некорректное неявное копирование объектов Класс для представления N-мерного вектора: class Vector { private: fload* coords; int size; public: Vector(int _size) { size = _size; coords = new float[size]; } float& operator[] (int pos) { return coords[pos]; } ~Vector() { delete[] coords; } … } Проблемный код: Vector a(3); a[0]=1; a[1]=1; a[2]=1; Vector b(3); b = a; // ссылка coords просто копируется b[0]=5; // у вектора а тоже поменяется a[0] test(a); // ссылка coords просто копируется Vector c = a; // ссылка coords просто копируется c[0] =5; // у вектора а тоже поменяется a[0] … void test(Vector test) { test[0] = 0; // у вектора а тоже поменяется a[0] … }

Конструктор копирования и оператор присваивания Везде, где происходит неявное конструктуироване нового объекта, посредством копирования старого, вызывается конструктор копирования класса. Он имеет вид: ClassName (const ClassName& copiedObj) { … } При присваивании одного объекта другому вызывается оператор присваивания. Он имеет вид: ClassName& operator=(const ClassName& copiedObj) { … } Например: class Vector { fload* coords; int size; Vector(const Vector& copiedObj) { // Конструктор копирования size = copiedObj.size; coords = new float[size]; for (int i=0; i<size; i++) coords[i] = copiedObj[i]; } Vector& operator=(const Vector& copiedObj) { // Оператор присваивания if (this != &copiedObj) { // защита от присваивания самому себе size = copiedObj.size; coords = new float[size]; for (int i=0; i<size; i++) coords[i] = copiedObj[i]; } return *this; // возвращаем себя как результат операции присваивания }

Решение: неявное копирование объектов Класс для представления N-мерного вектора: class Vector { private: fload* coords; int size; public: Vector(int _size) { size = _size; coords = new float[size]; } float& operator[] (int pos) { return coords[pos]; } ~Vector() { delete[] coords; } Vector(const Vector& copiedObj) { // Конструктор копирования size = copiedObj.size; coords = new float[size]; for (int i=0; i<size; i++) coords[i] = copiedObj[i]; } Vector& operator=(const Vector& copiedObj) { // Оператор присваивания if (this != &copiedObj) { // защита от присваивания самому себе size = copiedObj.size; coords = new float[size]; for (int i=0; i<size; i++) coords[i] = copiedObj[i]; } return *this; // возвращаем себя как результат операции присваивания } … } Рабочий код: Vector a(3); a[0]=1; a[1]=1; a[2]=1; Vector b(3); b = a; // вызывается оператор присваивания b[0]=5; // у вектора b свой массив coords test(a); // вызывается конструктор копирования Vector c = a; // вызывается конструктор копирования c[0] =5; // у вектора с свой массив coords … void test(Vector test) { test[0] = 0; // у вектора test свой массив coords … }

Ссылки и неявное копирование Избегайте неявного копирования, посредством использования ссылок в аргументах функций. Например: class Complex{ private: float real, image; public: Complex operator+(Complex obj) { // аргумент приходит не по ссылке Complex sum(real+obj.real, image+obj.image); return sum; } Complex a(1,1), b(2,2); Complex c = a+b; // сначала b скопируется в obj, а потом попадет в operator+ функцию Корректнее: class Complex{ private: float real, image; public: Complex operator+(Complex& obj) { // аргумент приходит по ссылке Complex sum(real+obj.real, image+obj.image); return sum; } Complex a(1,1), b(2,2); Complex c = a+b; // b не копируется в obj, а передается напрямую по ссылке в operator+

Ключевое слово const Ключевое слово const означает, что состояние объекта менять нельзя. Это контролируется компилятором. Целесообразно использовать const для предотвращения возможных ошибок. Например: bool correctCompareArrays (const int a[], const int b[], int size) { for (int i=0; i<size; i++) if (a[i] != b[i]) return false; // все хорошо return true; } bool errorCompareArrays (int a[], int b[], int size) { for (int i=0; i<size; i++) if (a[i] = b[i]) return false; // небольшая опечатка и программа работает некорректно return true; } bool uncompiledCompareArrays (const int a[], const int b[], int size) { for (int i=0; i<size; i++) if (a[i] = b[i]) return false; //небольшая опечатка, но не скомпилируется! return true; }

Ключевое слово const в определении метода объекта Ключевое слово const в определении метода объекта означает, что метод не меняет состояния объекта. Возможно существование 2-х версий одного метод (константный и обычный), тогда константный метод вызывается только для константных объектов, а обычный для неконстантных. Например: class Vector { private: fload* coords; int size; public: Vector(int _size) { size = _size; coords = new float[size]; } float operator[] (int pos) const { return coords[pos]; } float& operator[] (int pos) { return coords[pos]; } int size() const { // size = 0; - не скомпилируется return size; } void main() { Vector v(2); v[0] = 5; // вызовется float& operator[] (int pos) const Vector v2(2); v2[0] = 3; // не скомпилируется, т.к. вызывается float operator[] (int pos) const printf(“Size: %d”, v.size()); //работает }

Аргументы по умолчанию Проблема: дублирование кода class Date { private: int year, month, day; public: Date(int y, int m, int d) { year = y; month = m; day = d; } Date(int y, int m) { year = y; month = m; day = 1; } Date(int y) { year = y; month = 1; day = 1; } Date() { year = 1; month = 1; day = 1; } Решение: class Date { private: int year, month, day; public: Date(int y=1, int m=1, int d=1) { year = y; month = m; day = d; }