Разделы презентаций


Методы программирования (2 семестр)

Содержание

ННГУ, ВМК, 2004 г. Методы программирования 2. ООП Л. 01. Введение в ООП. Мееров И.Б.Краткое содержание предыдущей серииЕсть задачи, где идей

Слайды и текст этой презентации

Слайд 1ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Методы программирования (2 семестр)

Раздел 2. Лекция 02 Классы и объекты

Нижегородский государственный университет
им. Н.И. Лобачевского

Факультет вычислительной математики и кибернетики

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 2ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Краткое содержание предыдущей серии

Есть задачи, где идей структурного и модульного программирования недостаточно – сложные задачи.
На помощь приходит объектно-ориентированный подход (технология).
В основе подхода – объектно-ориентированная декомпозиция.
3 части – OOA, OOD, OOP.
Основные принципы: абстракция, инкапсуляция, иерархия (наследование), полиморфизм.

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 3ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Дальнейшее изучение

Реализация основных идей объектного подхода средствами языка программирования C++.
Инкапсуляция в C++.
Наследование в C++.
Полиморфизм в C++.


Итак, за дело!

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 4ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Мы такие “бяки-буки“
И, фон Нейман нас прости,
Мы плодим такие глюки,
Вам вовек не разгрести.

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 5ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Вместо вступления. С чего мы начинаем? Шаг 1

Пусть мы выделили некоторую абстракцию в предметной области (пример: прямоугольник).






Может нужно что-то уточнить?
Стороны прямоугольника параллельны осям координат.

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 6ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Вместо вступления. С чего мы начинаем? Шаг 2

Мы определили, какими свойствами он характеризуется (x, y, a, b – вещественные числа).






Что это было?
Проектирование данных.

a

b

(x; y)

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 7ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Вместо вступления. С чего мы начинаем? Шаг 3

Мы определили, какие действия можно выполнять над прямоугольником, как они работают.
Показать (Show).
Скрыть (Hide).
Подвинуть на dx, dy.
Вычислить площадь.




Что это было?
Проектирование операций.

S = ab

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 8ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Вместо вступления. С чего мы начинаем?

Итог нашей деятельности:
Выделена абстракция, существенная для предметной области.
Определено, какими данными характеризуются все такие абстракции.
Определено, какие операции можно выполнять над такими абстракциями.
Что мы получили?
В первую очередь, мы получили определение нового типа данных – “прямоугольник”!

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 9ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Типы данных

Вспомним определение типа данных. Ранее было выяснено, что тип данных определяет:
Множество значений.
Объем оперативной памяти, необходимой для хранения данных.
Набор операций, применимых к значениям данного типа.
Способ интерпретации данных, находящихся в оперативной памяти.

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 10ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Абстрактные типы данных

Существуют стандартные типы данных в языке программирования C: int, float, double…
Существуют средства проектирования новых типов данных: массивы, перечисления, структуры…
Абстрактный тип данных (АТД) – тип данных, отсутствующий в машинной реализации и сконструированный средствами языка программирования.
АТД = , где
Z – множество значений;
O – множество операций.

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 11ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Понятие класса_1

В языке программирования C существуют средства конструирования абстрактных типов данных. Однако, легко заметить, что множество значений и набор операций при этом никак не связаны друг с другом синтаксически! Связь присутствует только в голове программиста.

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 12ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Понятие класса_2

Язык C++ предоставляет средства реализации объектно-ориентированного подхода. Основа этих средств – понятие класса.
Класс является абстрактным типом данных, определяемым пользователем, и представляет собой модель реального объекта в виде данных и функций для работы с ними.

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 13ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

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

Итак, класс = данные + операции.
Терминология:
Элементы данных принято называть полями (member fields).
Поля реализуются способом, сильно напоминающим обычное объявление переменных.
Операции принято называть методами (member functions).
Методы реализуются способом, сильно напоминающим обычное объявление функций.

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 14ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

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

Простейший вариант:
class <имя класса> {
[private:]
<скрытые поля>;
<скрытые методы>;
public:
<открытые поля>;
<открытые методы>;
};

специальные ключевые слова

; завершает объявление класса!

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 15ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Секции private и public

private и public – спецификаторы доступа. Определяют 2 секции класса.
То, что объявлено в секции private, является скрытым и доступно только внутри методов данного класса и недоступно извне.
То, что объявлено в секции public, является интерфейсом класса и доступно везде.
Секция private может отсутствовать. Секция public должна присутствовать всегда, иначе классом нельзя будет воспользоваться.
Секции можно объявлять несколько раз, чередуя их произвольным образом.

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 16ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Поля класса

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

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 17ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

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

Идеи инкапсуляции реализуются в C++ при помощи следующих конструкций языка:
class – позволяет объединить данные и операции над ними в рамках одной синтаксической структуры языка программирования.
секции public и private позволяют реализовать разграничения доступа, позволяя:
скрыть детали внутренней реализации.
организовать защиту данных.

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 18ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Скрытие данных

Часто встречающаяся рекомендация: скрывайте все Ваши данные, объявляя их в секции private!
Что из этого следует? Если Вы хотите придерживаться этого тезиса, то Вам придется:
объявить все поля в секции private;
создать методы для доступа к этим полям; в противном случае, Вы просто не сможете с ними работать. Т.о., Вам понадобится то, что на жаргоне называется “setters and getters” – методы для установки значений скрытых полей (SetSomething) и чтения значений (GetSomething).

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 19ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Любую прогрессивную идею можно довести до уровня абсурда


Не скрывайте все данные просто так. Скрывайте то, что действительно относится к деталям реализации! Иначе, кроме потери эффективности и загромождения бесполезными методами Вы ничего не добьетесь (моя частная точка зрения ).

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 20ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Скрытие методов

К скрытию методов нужно подходить с умом. Рекомендации таковы:
Скрывайте те методы, которые имеют отношение к деталям внутренней реализации.
Скрывайте методы, которые с Вашей точки зрения не понадобятся пользователю разработанного Вами класса.
Секция public – интерфейс Вашего класса. Чем меньше там написано, тем проще пользователю класса разобраться, как с ним работать.
Создавайте те методы, которые нужны. Не создавайте 1000 методов только потому, что это красиво смотрится. Пользователь класса обязательно запутается в них.

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 21ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Пример: класс “комплексное число”_1

Проектирование:
поля: re, im – действительная и мнимая часть.
методы:
SetRe, GetRe, SetIm, GetIm.
Арифметические.
Вывод на экран (печать себя).
Специальные (конструктор, деструктор – рассмотрим позже).

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 22ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Пример: класс “комплексное число”_2

class TComplex {
private:
int Re, Im; // data
public:
//Set & Get
int GetRe() { return (Re); }
void SetRe(int _Re) { Re = _Re; }
int GetIm() { return (Im); }
void SetIm(int _Im) { Im = _Im; }
// Arithmetic methods
TComplex Add(TComplex C);
// User interface
void Print();
};

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 23ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Анализ примера_1

Данные скрыты.
Созданы методы Set и Get.
У этих методов в объявлении класса приведена реализация. В этом случае методы приобретают свойство “inline”, т.е. становятся встраиваемыми. Таким образом, компилятор в каждом месте, где происходит вызов метода, вместо вызова функции поставляет целиком ее тело. Рекомендация: имеет смысл “инлайнить” методы, реализация которых состоит из очень небольшого количества команд. Программный код разбухнет незначительно, зато получим большой выигрыш в скорости работы программы.

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 24ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Анализ примера_2

Объявлено 2 метода (для сложения и вывода значения на консоль).
Обратим внимание на метод сложения:
TComplex Add(TComplex C);
Этот метод принимает 1 параметр C типа TComplex.
Семантика работы метода: берет объект, к которому его применили, и к нему прибавляет комплексное число C.
Далее 2 варианта:
Результат записывается в исходный объект и его копия возвращается как результат. По смыслу получили аналог операции +=.
Формируется новый объект, выполняется операция сложения, новый объект возвращается как результат. По смыслу получили аналог операции +.

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 25ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Анализ примера_3

А какой из вариантов имеет место на самом деле? А это зависит от нас. Вернее, от того, как мы напишем реализацию метода.
Вопрос: где ее писать?
Ответ: возможны 2 варианта:
1) непосредственно в объявлении класса – получим встроенный метод;
2) отдельно.

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 26ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Объявление и реализация. Шаг 1

Создаем файл complex.h и помещаем туда объявление класса.

class TComplex {
private:
int Re, Im; // data
public:
//Set & Get
int GetRe() { return (Re); }
void SetRe(int _Re) { Re = _Re; }
int GetIm() { return (Im); }
void SetIm(int _Im) { Im = _Im; }
// Arithmetic methods
TComplex Add(TComplex C);
// User interface
void Print();
};

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 27ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Объявление и реализация. Шаг 2

Создаем файл complex.cpp и помещаем туда реализацию методов.







#include “complex.h”
TComplex TComplex::Add(TComplex C) {
… // реализация
}

void TComplex::Print() {
… // реализация
}

Общий вид:
<Тип результата> <Имя класса>::<Имя метода>(<Список параметров>) { <реализация> }

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 28ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Объявление и реализация. Шаг 2. Варианты реализации метода Add

// Аналог операции +=
TComplex TComplex::Add(TComplex C) {
Re += C.GetRe();
Im += C.GetIm();
return *this;
}
// Аналог операции +
TComplex TComplex::Add(TComplex C) {
TComplex temp;
temp.SetRe(Re + C.GetRe());
temp.SetIm(Im + C.GetIm());
return temp;
}
// На самом деле реализуем что-то одно.

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 29ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Разные соображения

Вернемся к заголовку метода Add: TComplex Add(TComplex C);
Элементы оптимизации: копирование параметра – долго, будем передавать его по ссылке: TComplex Add(TComplex &C);
Проблема: операции + и += не должны изменять правую часть! Решение: TComplex Add(const TComplex &C);
Посмотрим на метод Print: void Print();
Метод Print не должен менять поля класса. По смыслу он “константный”. void Print() const;

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 30ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

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

Константный метод:
объявляется с ключевым словом const после списка параметров;
не может изменять значения полей класса;
может вызывать только константные методы;
может вызываться для любых (не только константных) объектов.

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 31ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Пример: класс “комплексное число”

class TComplex {
private:
int Re, Im; // data
public:
//Set & Get
int GetRe() const { return (Re); };
void SetRe(int _Re) { Re = _Re; };
int GetIm() const { return (Im); };
void SetIm(int _Im) { Im = _Im; };
// Arithmetic methods
TComplex Add(const TComplex &C);
// User interface
void Print() const;
};

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 32ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Создание объектов

До сих пор мы описывали тип данных. А как создавать переменные этого типа?
Переменные типа “класс” называются объектами или экземплярами. Логичная терминология, в отличие от Object Pascal.
Синтаксис объявления стандартный:
Статическое создание объекта: <Имя класса> <Имя объекта>;
Динамическое создание объекта:
<Имя класса> *<Имя объекта> = new <Имя класса>();

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 33ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Примеры статического и динамического создания объектов

Статическое создание объектов: TComplex A, B;
Динамическое создание объекта:
TComplex *A = new TComplex();
В дальнейшем мы увидим, что синтаксис может быть и более сложным (раздел “конструкторы”).

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

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 34ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Доступ к данным и методам объектов

В случае статического создания объекта доступ к его полям и методам осуществляется посредством точки: TComplex A(); A.SetRe(1); A.SetIm(5); A.Print(); A.Re = 8;//Ошибка компиляции! Поле Re скрыто
В случае динамического создания объекта доступ к его полям и методам осуществляется посредством стрелки: TComplex *A = new TComplex(); A->SetRe(1); A->SetIm(5); A->Print(); A->Re = 8; //Ошибка компиляции! Поле Re скрыто

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 35ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Создание объектов. Взгляд изнутри

TComplex A, B;





A.SetRe(1); A.SetIm(2);

B.SetRe(2); B.SetIm(3);

A

Re

Im

Реализация методов

B

Re

Im

A

1

2

Реализация методов

B

2

3

ОЗУ

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 36ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Объекты и методы класса. Как объект “добирается” до методов своего класса

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

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 37ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Как метод “добирается” до данных объекта. Указатель this _1

Рассмотрим метод SetRe совместно с примером его использования.
Реализация:
void SetRe(int _Re) { Re = _Re; }
Использование:
A.SetRe(1);
Вопрос: как это работает? Смотрим реализацию: какому-то Re присваивается переданное в функцию значение. А как компилятор узнает, у какого именно объекта нужно менять Re?

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 38ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Как метод “добирается” до данных объекта. Указатель this _2

Реализация:
void SetRe(int _Re) { Re = _Re; }
Использование:
A.SetRe(1);
Ответ:
на самом деле ни один метод класса не вызывается сам по себе;
каждый метод вызывается для конкретного объекта (A в примере);
каждый метод класса обязательно получает 1 неявный параметр, указатель на объект, для которого был вызван! (есть исключение – статические методы, об этом позже);
внутри метода указатель доступен под именем this.

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 39ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Как метод “добирается” до данных объекта. Указатель this _3. Пример

Реализация 1:
void SetRe(int _Re) {
Re = _Re;
}
Реализация 2:
void SetRe(int _Re) {
this->Re = _Re;
}
РЕАЛИЗАЦИЯ1 ≡ РЕАЛИЗАЦИЯ2

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 40ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Как метод “добирается” до данных объекта. Указатель this _4. Пример

Использование:
A.SetRe(1);
B.SetRe(2);

A

Re

Im

B

Re

Im

void SetRe(int _Re) {
this->Re = _Re;
}

A

B

ОЗУ

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 41ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Использование указателя this

Указатель this неявно используется компилятором. Вопрос: когда возникает необходимость его использования?
// Аналог операции +=
TComplex TComplex::Add(const TComplex &C) {
Re += C.GetRe();
Im += C.GetIm();
return *this;
}

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 42ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Некоторые “хитрости” и “тонкости” в статическом и динамическом создании объектов внутри методов

Мыслим мы машинным кодом,
Это высший пилотаж.
Всех поздравит с Новым Годом
Самый новый вирус наш.

Вопрос 1: что произойдет, сели мы будем писать возвращаемый результат в методе со значком & ?
Вопрос 2: как это будет взаимодействовать со статическим и динамическим созданием объектов внутри методов?

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 43ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Профессиональные программисты о языке C/C++

When the non-C programmers around here need to do a little C work, I just tell them to add asterisks and ampersands until it works or come get me 
© Charles Patterson

источник: http://lye.upnet.ru

Проблема в том, что многие так и поступают. Иногда “метод научного тыка” вдруг перестает работать в самый неподходящий момент. Как же обойтись без него?
НУЖНО ПОНИМАТЬ, КАК ЭТО РАБОТАЕТ!

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 44ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Энциклопедия ошибок в работе со ссылками в заголовке метода. Глюк №1

void TComplex::MakeSameAs(TComplex &C) {
int _re = re, _im = im;
re = C.GetRe(); im = C.GetIm();
C.SetRe(_re); C.SetIm(_im);
}

void main(void) {
TComplex A(), B();
A.Print(); B.Print();
A.MakeSameAs(B);
A.Print(); B.Print();
}

Тот, кто реализовывал метод, ошибся и вместо копирования написал обмен значениями. Тот, кто пользовался классом, узнает об этом не скоро! “Сюрприз будет” 

void TComplex::MakeSameAs(const TComplex &C) {

Решение

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 45ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

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

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 46ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Энциклопедия ошибок в работе со ссылками в заголовке метода. Глюк №2

// Аналог операции +
TComplex& TComplex::Add(const TComplex &C) {
TComplex temp();
temp.SetRe(Re + C.GetRe());
temp.SetIm(Im + C.GetIm());
return temp;
}
Как это работает?
Создается temp.
Ему присваиваются значения.
Возвращается адрес локальной переменной temp.
temp уничтожается!

// Аналог операции +
TComplex TComplex::Add(const TComplex &C) {
TComplex temp();
temp.SetRe(Re + C.GetRe());
temp.SetIm(Im + C.GetIm());
return temp;
}

Решение

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 47ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

If debugging is the art of removing bugs, then programming must be the art of putting them in.
Edsger W. Dijkstra

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 48ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Энциклопедия ошибок в работе со ссылками в заголовке метода. Глюк №3

// Аналог операции +
TComplex& TComplex::Add(const TComplex &C) {
TComplex* temp = new TComplex();
temp->SetRe(Re + C.GetRe());
temp->SetIm(Im + C.GetIm());
return *temp;
}
Как это работает?
Создается динамически temp.
Ему присваиваются значения.
Возвращается адрес динамически созданной переменной temp.
temp не уничтожается! А если это происходит в цикле?

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 49ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Энциклопедия ошибок в работе со ссылками в заголовке метода. Глюк №3

// Аналог операции +
TComplex& TComplex::Add(const TComplex &C) {
TComplex* temp = new TComplex();
temp->SetRe(Re + C.GetRe());
temp->SetIm(Im + C.GetIm());
return *temp;
}
Единственный способ освободить память:
TComplex A(), B(), C(); TComplex *p;
C = A.Add(B); // потеря памяти
С = *(p = &A.Add(B)); delete p; // Ужас!

Решение: возвращаем TComplex

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 50ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Выводы. Статическое и динамическое создание объектов внутри методов. Ссылки в заголовках методов

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

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 51ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Следующая тема

Создание объектов, конструкторы и деструкторы.

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Слайд 52ННГУ, ВМК, 2004 г.

Методы программирования 2. ООП Л. 01.

Введение в ООП. Мееров И.Б.

Павловская Т.А. C/C++ Программирование на языке высокого уровня.
Ален И. Голуб. Правила программирования на C/C++.
Из книг заимствованы различные идеи, элементы текста.
http://lye.upnet.ru
http://xaxa.h1.ru/jokes.html

ННГУ, ВМК, 2004 г.           Методы программирования 2.

Обратная связь

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

Email: Нажмите что бы посмотреть 

Что такое TheSlide.ru?

Это сайт презентации, докладов, проектов в PowerPoint. Здесь удобно  хранить и делиться своими презентациями с другими пользователями.


Для правообладателей

Яндекс.Метрика