Всё для Учёбы — студенческий файлообменник
1 монета
pdf

Студенческий документ № 043123 из НИТУ МИСиС

Объектно-ориентированное программирование

с использованием C++

Полевой Дмитрий Валерьевич

к.т.н., доцент КИК e-mail: oop.misis@gmail.com

Подстановка значений

• "волшебные числа"

• вычисления на этапе компиляции

• подстановка значений (без выделения памяти)

#define MAX_PATH 256 или const int MAX_PATH(256);

Константность (const)

• замена препроцессора

• строгий контроль типов

• защита данных

• оптимизация

Константность и защита данных

• инициализация в процессе выполнения

• изменение не предусмотрено

• компилятор пресекает попытки потенциального изменения (проверка присваиваний)

Указатель (pointer)

• тип Т* - тип "указатель на Т"

• переменная типа Т* содержит адрес объекта типа Т

• разыменование (косвенное обращение)

пример: char с1 = 'а';

char* p = &с1; //m_x = x;

} или

void Point::setX(const int x)

{ (*this).m_x = x;

} Пример удачный (this)

T& T::operator++() {

// содержательная работа return *this;

} Использование this

• использовать единообразно

• избегать избыточности

- использовать при необходимости,

т.е. НЕ для доступа к членам в методах

Константные поля

• не изменяются после создания объекта

• инициализируются в списке инициализации

Константные поля (пример)

class FixedArr { public:

FixedArr(int size); private: const int m_size;

///... }; FixedArr::FixedArr(int size) : m_size(size)

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

• сохраняют логическую константность

- не изменяют состояния полей кроме mutable

• могут вызываться для константных экземпляров

• отличаются от неконстантных методов с тем же набором параметров

Константные методы (пример)

class FixedArr

{ public: //... int size() const;

//... };

int FixedArr::size() const {

//...

Члены-ссылки

• сильно связанные данные (классы)

• инициализируются в списке инициализации

• блокируют создание умолчательного конструктора

Ссылочные члены (поля)

class Point { public:

Point(Axes& axes); private:

Axes& m_axes;

///... }; Point::Point(Axes& axes) : m_axes(axes)

///... Инвариант класса

• "всегда" истинное логическое утверждение (члены)

• выполняется в начале и конце метода

• может нарушаться внутри метода

Локальная переменная

• конструктор вызывается когда управление передается инструкции, содержащей объявление переменной

• деструктор вызывается при выходе из блока, содержащего объявление переменной

Умолчательный конструктор

• конструктор без аргументов

• генерируется автоматически, если нет объявления других конструкторов

• вызывается

- создание переменной без использования инициализаторов

- создание элемента массива

Копирование объектов

• инициализация через копирование

• присваивание

• передача аргументов и возврат значений

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

Класс с указателями (пример)

class String { public:

String()

: m_pStr(new char[SIZE_DEF])

{} ~String() { delete[] m_pStr;

} private: char m_pStr;

}; Проблемы копирования (пример)

CString str1; /// Копирующая инициализация - проблема!

CString str2 = str1;

CString str3; /// Копирующее присваивание - проблема!

str3 = str1;

Копирование и управление ресурсами

• почленное копирование неправильно для классов, реализующих управление ресурсами (конструктор/деструктор)

• необходимо использовать пользовательский конструктор копирования и оператор присваивания

Конструктор копирования

T::T(const T&) • генерируется автоматически, если не определен пользователем

• м.б. запрещен, определением в private

Конструктор копирования (пример)

String::String(const String& copy)

: m_pStr(new char[copy.size()])

, m_len(copy.len)

{ memcpy(m_pStr, copy.m_pStr, sizeof(*m_pStr) * size());

} Оператор присваивания

T& T::operator=(const T&)

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

• м.б. запрещен, определением в private

Схема присваивания (простая)

• защита от присваивания самому себе

• удаление старых элементов

• создание и инициализация

(копирование) новых элементов

• существует другая схема (безопасная при исключениях)

Оператор присваивания (пример)

T& T::operator=(const T& copy) {

// защита от присваивания самому себе if (this != ©) {

// копирование

} return *this; }

Инициализация и присваивание

• копирующий конструктор

- инициализирует неинициализированную память

• копирующее присваивание

- должно обеспечивать правильную работу с уже созданными объектами

• избегайте ошибок при попытке уменьшения объема кода

Ошибка генерации автоматического копирования

• если нестатический член является

- ссылкой

- константой

- определяемым пользователем типом, не имеющим копирующего оператора присваивания

Структура (struct)

• составной пользовательский тип

• определяет набор (почти) произвольных типов

• именованный доступ

POD типы

• Plain Old Data

• объекты можно копировать как фрагменты памяти

Пример структур

пример:

struct Address { char[256] m_name; unsigned int m_zip;

}; Adress companyAddress; //! не инициализирован Adress myAddress = {"D.V. Polevoy", 156987};

Доступ к членам структур

• аналогично классам

• . - оператор доступа к члену

• -> - оператор разыменования члена структуры (для указателя на структуру)

Перечисление (enum)

• пользовательский тип

• может иметь собственное имя

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

• приводится к целому в выражениях

Примеры перечислений

enum KeyWord { ASM,

AUTO, BREAK };

KeyWord word(ASM);

enum Status

{ OFF, ON, DISABLE = 255

} 25.02.2012 cppNewb.ru 2

25.02.2012 cppNewb.ru 3

Показать полностью…
109 Кб, 17 марта 2012 в 12:24 - Россия, Москва, НИТУ МИСиС, 2012 г., pdf
Рекомендуемые документы в приложении