Скачать презентацию Синтаксис ООП в С примеры классов Программирование Скачать презентацию Синтаксис ООП в С примеры классов Программирование

ООА cpp 04 - синтаксис, примеры.ppt

  • Количество слайдов: 21

Синтаксис ООП в С++, примеры классов Программирование Синтаксис ООП в С++, примеры классов Программирование

Содержание • • • Объявление класса, создание объекта Создание массива объектов Разделение на объявление Содержание • • • Объявление класса, создание объекта Создание массива объектов Разделение на объявление и реализацию Использование ключевого слова this Конструктор класса Деструктор класса Конструктор и создание массивов Использование ключевого слова const Конструктор копий Перегрузка оператора = Программирование

Объявление класса, создание объекта Объявление класса (можно, например, перед main()): class My. Class { Объявление класса, создание объекта Объявление класса (можно, например, перед main()): class My. Class { public: void Foo () { printf ("Function Foo from My. Class"); } }; Простое создание и использование объекта: int main (int argc, char* argv[]) { My. Class object 1; object 1. Foo(); return 0; } в этом месте object 1 удаляется автоматически Динамическое выделение памяти под объект: My. Class* object 2 = new My. Class(); object 2 ->Foo(); delete object 2; Программирование

Создание массива объектов Статичный массив: My. Class arr[10]; for (int i = 0; i Создание массива объектов Статичный массив: My. Class arr[10]; for (int i = 0; i < 10; i++) arr[i]. Foo(); Массив с выделением памяти: My. Class* arr = new My. Class[10]; инициализируются все 10 объектов for (int i = 0; i < 10; i++) arr[i]. Foo(); все объекты удаляются вместе с массивом delete[ ] arr; Массив указателей на объекты с выделением памяти: My. Class** arr = new My. Class* [10]; 10 указателей на объекты for (int i = 0; i < 10; i++) { arr[i] = new My. Class(); выделение памяти под конкретный объект arr[i]->Foo(); } удаление объекта for (int i = 0; i < 10; i++) delete arr[i]; удаление массива delete[ ] arr; Программирование

Разделение на объявление и реализацию В языке C++ удобно разделять объявление и реализацию классов, Разделение на объявление и реализацию В языке C++ удобно разделять объявление и реализацию классов, чтобы использовать в проектах как модули: // файлы класса (можно считать модулем) myclass. h myclass. cpp // точка входа и общие алгоритмы main. cpp Объявление класса – содержимое файла myclass. h: #include class My. Class { public: void Foo(); int Get. Value(); private: int hidden. Value; }; Программирование

Разделение на объявление и реализацию В языке C++ удобно разделять объявление и реализацию классов, Разделение на объявление и реализацию В языке C++ удобно разделять объявление и реализацию классов, чтобы использовать в проектах как модули: // файлы класса (можно считать модулем) myclass. h myclass. cpp // точка входа и общие алгоритмы main. cpp Реализация методов класса – myclass. cpp: #include "myclass. h" void My. Class: : Foo() { hidden. Value = 42; printf ("hidden. Value initialized"); } int My. Class: : Get. Value() { return hidden. Value; } Программирование

Разделение на объявление и реализацию В языке C++ удобно разделять объявление и реализацию классов, Разделение на объявление и реализацию В языке C++ удобно разделять объявление и реализацию классов, чтобы использовать в проектах как модули: // файлы класса (можно считать модулем) myclass. h myclass. cpp // точка входа и общие алгоритмы main. cpp Использование класса – main. cpp: #include #include "myclass. h" int main (int argc, char* argv[]) { My. Class obj; obj. Foo(); int k = obj. Get. Value(); printf ("%d", k); return 0; } Программирование

Условное деление классов по ролям Можно выделить два типа классов: 1. Основные 2. Вспомогательные Условное деление классов по ролям Можно выделить два типа классов: 1. Основные 2. Вспомогательные Player – игрок Game. Field – игровое поле Account – банковский счёт My. String – работа со строками My. Config – настройки My. Data. Base – хранилище данных My. Web – работа с Интернетом Основные описывают предметную область конкретной задачи и создаются прежде всего под её условия. Вспомогательные классы создаются универсальными и используются повторно в других программах. Программирование

Использование ключевого слова this В методах класса имена переменных вступают в коллизию: class My. Использование ключевого слова this В методах класса имена переменных вступают в коллизию: class My. Class { private: имена параметров функции char buff[100]; дублируют имена свойств класса int size; public: void Set. Buff (char *buff, int size) { this->size = size; strncpy ( this->buff, size ); this->buff[size] = ''; } ключевое слово this спешит на помощь }; Внутри методов класса this является указателем на экземпляр класса, от имени которого вызван метод. Программирование

Конструктор класса Автоматическую инициализацию объекта можно выполнить при помощи специальных методов – конструкторов: class Конструктор класса Автоматическую инициализацию объекта можно выполнить при помощи специальных методов – конструкторов: class My. Class { private: int* arr. Buff; int size; public: My. Class() { size = 42; arr. Buff = new int[size]; memset( arr. Buff, 0, size * sizeof(int) ); } void Set. Element (int index, int value) { arr. Buff[index] = value; } int Get. Element. At (int index) { return arr. Buff[index]; } }; My. Class ints. Array; ints. Array. Set. Element(13, 99345); printf( "%d", ints. Array. Get. Element. At(13) ); printf( "%d", ints. Array. Get. Element. At(14) ); Программирование

Конструктор класса Конструктор с параметрами: class My. Class { private: int* arr. Buff; int Конструктор класса Конструктор с параметрами: class My. Class { private: int* arr. Buff; int size; public: My. Class (int init. Size, int default. Value = 0) { size = init. Size; arr. Buff = new int[size]; for (int i = 0; i < size; i++) arr. Buff[i] = default. Value; } }; My. Class ints. Array(10, 42); My. Class zero. Ints. Array(17); // 10 элементов со значением 42 каждый // 17 элементов со значением 0 My. Class* ptr. Ints. Array = new My. Class(20, 100); delete ptr. Ints. Array; My. Class err. Array; // 20 элементов со значением 100 //! ОШИБКА: нет конструктора по-умолчанию Программирование

Конструктор класса Несколько конструкторов: class My. Class { private: int* arr. Buff; конструктор по-умолчанию Конструктор класса Несколько конструкторов: class My. Class { private: int* arr. Buff; конструктор по-умолчанию гарантирует, int size; что каждый новый объект правильно public: заполнен на начальном этапе My. Class() { arr. Buff = new int[0]; size = 0; } My. Class (int init. Size, int default. Value = 0) { size = init. Size; arr. Buff = new int[size]; for (int i = 0; i < size; i++) arr. Buff[i] = default. Value; } }; My. Class ints. Array(10, 42); // 10 элементов со значением 42 My. Class empty. Array; // вызывается конструктор по-умолчанию Программирование

Деструктор класса Специальный метод, автоматически вызываемый при удалении объекта – деструктор: class My. Class Деструктор класса Специальный метод, автоматически вызываемый при удалении объекта – деструктор: class My. Class { private: int* arr. Buff; int size; public: My. Class (int init. Size) { size = init. Size; arr. Buff = new int[size]; } ~My. Class() { delete[ ] arr. Buff; } }; int main (int argc, char* argv[]) { выделяется память под буфер My. Class ints. Array(10); return 0; удаляется объект, освобождается память } Программирование

Конструктор и создание массивов Если в классе нет конструктора по-умолчанию: class My. Class { Конструктор и создание массивов Если в классе нет конструктора по-умолчанию: class My. Class { default конструктора нет, но зато есть private: конструктор с параметрами int* arr. Buff; public: My. Class (int init. Size) { arr. Buff = new int[init. Size]; } ~My. Class() { delete[ ] arr. Buff; } }; My. Class arr[10]; My. Class* arr 2 = new My. Class[10]; //! ОШИБКА: нет конструктора по-умолчанию //! ОШИБКА: снова нет конструктора My. Class** arr = new My. Class*[10]; for (int i = 0; i < 10; i++) arr[i] = new My. Class(15); //. . . полезная работа for (int i = 0; i < 10; i++) delete arr[i]; delete[ ] arr; Программирование

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

Использование ключевого слова const Функция, которая ничего не меняет в объекте: class My. Class Использование ключевого слова const Функция, которая ничего не меняет в объекте: class My. Class { public: void Dummy. Func() const { printf ("I will not change this object never!"); } }; Функция, результат которой нельзя менять: class My. Class { public: const char* Get. String() { return "One has not to change this string"; } }; My. Class foo; char *err. Str = foo. Get. String(); //! ОШИБКА: нельзя без константы My. Class foo; const char *ok. Str = foo. Get. String(); Программирование

Использование ключевого слова const Функция, параметры которой внутри не поменяются: class My. Class { Использование ключевого слова const Функция, параметры которой внутри не поменяются: class My. Class { аналог передачи параметра по public: указателю, только синтаксически более void Usefull. Func (int &a) { лучше в использовании a++; } void Useless. Func (const int &a) { a++; //! ОШИБКА: нельзя менять значение } }; int a = 42; My. Class val; val. Usefull. Func(a); printf ("%d", a); // уже 43 val. Useless. Func(a); // переменная точно не изменится внутри Программирование

Использование ключевого слова const Полный const: class My. Class { public: const char* Triple. Использование ключевого слова const Полный const: class My. Class { public: const char* Triple. Combo. Hit (const Some. Foo ¶m) const {. . . } }; Сложно даже представить, зачем может понадобиться такой вариант написания, не так ли? Загляните в код библиотеки stl, будете удивлены. Программирование

Конструктор копий Особенный конструктор копий для клонирования объектов: class My. Class { private: int Конструктор копий Особенный конструктор копий для клонирования объектов: class My. Class { private: int arr[100]; public: My. Class () { /* пустой конструктор */ } My. Class (const My. Class ©. From) { for (int i = 0; i < 100; i++) this->arr[i] = copy. From. arr[i]; } }; конструктор по-умолчанию нужен для удобства, пусть даже пустой великий и ужасный конструктор копий И когда потребуется создать объект на базе другого, то: My. Class src; . . . My. Class dst (src); тут он как раз и действует Программирование

Перегрузка оператора = Вместо клонирования объекта бывает удобнее применить копирование: class My. Class { Перегрузка оператора = Вместо клонирования объекта бывает удобнее применить копирование: class My. Class { private: int arr[100]; public: My. Class& operator= (const My. Class ©. From) { if (this == ©. From) по адресу источника определяем, return *this; for (int i = 0; i < 100; i++) не пытаемся ли мы себя в себя this->arr[i] = copy. From. arr[i]; скопировать return *this; } разыменование адреса }; My. Class src; . . . My. Class dst; dst = src; Программирование

Конструктор копий и оператор = Полный вариант выглядит, как правило, так: class My. Class Конструктор копий и оператор = Полный вариант выглядит, как правило, так: class My. Class { private: int arr[100]; void m. Assign (const My. Class ©. From) { for (int i = 0; i < 100; i++) this->arr[i] = copy. From. arr[i]; } public: My. Class() { /* пустой конструктор */ } My. Class (const My. Class ©. From) { m. Assign (copy. From); } My. Class& operator= (const My. Class ©. From) { if (this == ©. From) return *this; m. Assign (copy. From); return *this; } }; Программирование