Часть 1. Основы ООП Объекты и инкапсуляция.
Типы данных Большинство языков программирования предоставляют примитивные типы данных (целое число, число с плавающей точкой) и массивы. В C++ размер динамического массива определяется размером региона памяти, используемого для его хранения. Размер региона является самостоятельным данным.
Составные типы данных Зачастую удобно работать с набором сходных данных как с единым целым: комплексное число, строка. В C для хранения набора разнотипных значений используются структуры. Зачастую значения полей структуры существенно связаны.
Строки в C Hello,world!\0 Маркер конца строки Массив символов строки (char [14])
Строки в C Регион памяти занят под массив char. Последний элемент – 0. Размер региона – размер строки. Операции – серия функций: strlen, strcmp, strcat, strcpy. Легко забыть поставить 0. Легко перейти границу. Легко забыть освободить память.
Конкатенация строк char * strcat(char * dest, const char * src) { char * destEnd = dest; while (*destEnd != '\000') destEnd++; const char * srcPos = src; while (*srcPos != '\000') { *destEnd = *srcPos; srcPos++, destEnd++; } *destEnd = '\000'; return dest; }
Инвариантость typedef struct { char * data; unsigned int size; } string; Операции сохраняют правильность связей. Если пользователь может нарушить связь между данными, он это сделает.
Инкапсуляция Никакие (или почти никакие) данные составной структуры нельзя напрямую писать и читать. Работа с переменной составного (объектного) типа происходит только (или почти только) при помощи предоставляемых операций.
Объект = данные + операции string S = mama mila ramu; // for ( int i = 0; i < S.length(); i++ ) cout
Строки в Java String A = mama mila ramu; char data[] = {'a', 'b', 'c'}; String str2 = new String(data); A.compareTo ( B ); // int A = B.concat ( C ); A.equals ( B ); // bool S = S.substring ( 1, 5 ); S = S.toLowerCase(); System.out.println ( S= + S );
Оператор присваивания Переменная объектного типа – ссылка. Human A = new Human ( Ivanov, Ivan, Ivanovich ); System.out.println ( A.calcFIO() ); // Ivanov I. I. Human B = A; B.setPatronimic ( Petrovich ); Чему равно A.getPatronimic() ?
Оператор сравнения Human C = new Human ( Ivanov, Ivan, Petrovich ); Чему равно A == C ? Оператор сравнения – это проверка на идентичность объектов, а не на равенство имеющихся у них данных.
Что умеет делать каждый объект в Java? A.clone () – операция, возвращающая копию объекта. A.equals ( B ) – операция, возвращающая результат сравнения двух объектов. A.toString() – операция, возвращающая строковое представление объекта.
Класс Одинаковые объекты – принадлежат одному классу. Класс – единица программы (.java ), определяющая новый тип данных в границах одного модуля. public class Human { // Java... }
Данные private String Name; // Java private String Surname; private String Patronimic; private: // C++ string Name; string Surname; string Patronimic;
Операции В C++ и Java операции над объектами называются методами объекта. public String getName(); public String setName(String aName); public String getFIO(); public Human (String aName, String aSurname, String aPatr);