Скачать 0.6 Mb.
|
БЕЛОРУССКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ МЕХАНИКО-МАТЕМАТИЧЕСКИЙ ФАКУЛЬТЕТ Кафедра численных методов и программирования И. Н. Блинов, В. С. Романчик ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ НА С++ Учебно-методическое пособие по курсу «МЕТОДЫ ПРОГРАММИРОВАНИЯ» для студентов механико-математического факультета МИНСК БГУ 2005 УДК 004.43(075.8) ББК 32.973.26-018.1я73 Б69 Рекомендовано Ученым советом механико-математического факультета 29 марта 2005 г., протокол № 5 Рецензенты: кандидат физико-математических наук, доцент И. М. Галкин; кандидат физико-математических наук, доцент C. В. Суздаль Блинов, И. Н. Б69 Объектно-ориентированное программирование на языке С+ учебно-метод. пособие для студ. механико-матем. фак. / И. Н. Блинов, В. С. Романчик. Мн.: БГУ, 2005. - 57 с. ISBN 985-485-498-1. В пособии рассматриваются вопросы, относящиеся к использованию технологии объектно-ориентированного программирования на языке C++. Описание методологии построения и использования классов сопровождается многочисленными примерами. Предназначено для студентов 2-го курса механико-математического факультета, изучающих курс «Методы программирования». УДК 004.43(075.8) ББК 32.973.26-018.1я73 © Блинов И.Н., Романчик В.С., 2005 ISBN 985-485-498-1 © БГУ, 2005 ВВЕДЕНИЕ Язык С++ был спроектирован и разработан в фирме Bell Laboratories (США) в 1983 г. как расширение языка С. Оператор инкрементирования «++» в действительности означает переносимость С-программ в среду С++. Разработчик языка Б. Страуструп кроме языка C называет еще один источник С++ - язык Simula67. Из него позаимствовано понятие «класса», соответствующего введенному пользователем типу, для которого обеспечиваются набор данных и операции над данными. Классы делают возможным сокрытие данных, инициализацию данных, неявное преобразование типов, механизмы перегрузки операций. В настоящее время классы рассматриваются как реализация парадигмы объектно-ориентированного программирования (ООП), представляющей собой технологию построения программ в виде множества взаимодействующих объектов. Структура и поведение этих объектов описаны иерархическими классами - абстрактными типами данных с открытым интерфейсом и скрытой внутренней реализацией. В классах реализованы такие базовые принципы ООП, как:
4) полиморфизм - возможность использования одних и тех же методов при работе с различными объектами базового и порожденных классов. Существует несколько реализаций системы, поддерживающих стандарт С++, из которых можно выделить реализации Visual C++ (Microsoft) и Builder C++ (Inprise). Отличия относятся в основном к используемым библиотекам классов и средам разработки. В действительности в программах С++ можно использовать библиотеки языка С, библиотеки классов С++, библиотеки визуальных классов VCL (Builder C++), библиотеку MFC (Visual C++ и Builder C++). Язык С++ является родоначальником множества объектно-ориентированных языков, таких как Java, C#, PHP и др. Данное пособие предназначено для студентов начинающих изучать технологию ООП на основе С++. КЛАССЫ. ПЕРВОЕ ЗНАКОМСТВО Простейшее определение класса без наследования имеет вид: class имя_класса { // по умолчанию раздел private - частные члены класса public: //открытые функции и переменные класса }; Определение класса соответствует введению нового типа данных, а понятие переменной данного типа - понятию объекта (экземпляра) класса. Список членов класса включает определение данных и функций (те из них, чьи объявления находятся в описании класса, называются функциями-членами класса). В ООП для таких функций используется термин "методы класса". Классы могут также содержать определения функций, тело которых помещается в определение класса (inline-функции). Для инициализации/уничтожения объектов используются специальные функции-конструкторы с тем же именем, что и класс, и деструкторы с именем класса, перед которым стоит символ "~". Переменные, объявленные в разделе класса по умолчанию как частные (private), имеют область видимости в пределах класса. Их можно сделать видимыми вне класса, если поставить перед началом объявления слово public. Обычно переменные в классе объявляются private-переменными, а функции - видимыми (public). Открытые функции-члены класса имеют доступ ко всем закрытым данным класса, через них возможен доступ к этим данным. Классами в С++ являются также структуры (struct) и объединения (union). Отличием структуры и объединения от класса является то, что их члены по умолчанию открытые (public), а не закрытые. Это обеспечивает преемственность с языком C. Кроме того, структуры и объединения не могут наследоваться и наследовать. В следующей программе определяется простейший класс Strtype, членами которого являются массив str типа char и функции set(), show(), get(). #include //пример 10 #include #include class Strtype{ char str[80]; //private public: void set (char *);//задать str void show(); //вывести str char* get(); //вернуть str }; //конец определения класса void Strtype: :set(char *s) {// определение метода set() strcpy(str,s);}//копирование s в str void Strtype::show() {// определение метода show() cout< char * Strtype::get() {// определение метода get() return str;} int main() { Strtype obstr; //объявление объекта obstr.set("bel.university ");//вызов метода set() obstr.show();//вызов метода show() cout<< while(!kbhit());//задержка выхода до нажатия клавиши return 0; } Вывод: bel.university bel.university Массив член-класса str является частным (private), доступ к нему возможен только через функции-члены класса. Такое объединение в классе сокрытых данных и открытых функций и есть инкапсуляция. Здесь obstr - объект данного класса. Вызов функции осуществляется из объекта добавлением к имени объекта имени функции, через точку или ->, если используется указатель на объект. Приведем примеры нескольких объявлений объектов: Strtype a; //объект a Strtype x[100]; //массив объектов Strtype *p; //указатель на объект p=new Strtype; // создание динамического объекта a.set("строка"); // вызов функций x[i].set("строка"); p->set("строка"); Оператор расширения области видимости "::" указывает доступ к элементам класса. Например, Strtype::set(char *s) означает принадлежность функции set(char *s) области видимости класса Strtype. Кроме этого, оператор "::" используется для доступа к данным класса (оператор вида Strtype ::count) и указания внешней или глобальной области видимости переменной, скрытой локальным контекстом (оператор вида -globalName/ Следующая программа демонстрирует создание класса Stack на основе динамического массива. Для инициализации объекта класса используется метод Stack() - конструктор класса. #include // пример 11 #include #defineSIZE10 // объявление класса Stack для символов class Stack { char *stck; // содержит стек int tos; // индекс вершины стека public: Stack(); //конструктор ~Stack(){delete [] stck;}//деструктор void push(char ch); // помещает в стек символ char pop(); // выталкивает из стека символ }; // инициализация стека Stack: :Stack(){ stck=new char[SIZE];//динамический массив tos=0; cout « "работа конструктора .…. \n"; } // помещение символа в стек void Stack::push(char ch){ if (tos==SIZE) {cout « "стек полон";return; } stck[tos]=ch; tos++; } // выталкивание символа из стека char Stack::pop(){ if (tos==0) {cout « "стек пуст";return 0;} tos--; return stck[tos]; } int main(){ /*образование двух автоматически инициализируемых стеков */ Stack s1, s2; //вызов конструктора для s1 и s2 int i; s1 . s1 . s1 . for(i=0;i<3;i++) cout<<"символ из s1:"<<3;i++) cout<<"символ из s2:"< while(!kbhit());//задержка return 0; } Вывод: Работа конструктора .…. Работа конструктора .…. Символ из s1:c Символ из s1:b Символ из s1:a Символ из s2:z Символ из s1:y Символ из s1:x Конструктор Stack() вызывается автоматически при создании объектов класса s1,s2 и выполняет инициализацию объектов, состоящую из выделения памяти для динамического массива и установки указателя на вершину стека в нуль. Конструктор может иметь аргументы, но не имеет возвращаемого значения и может быть перегружаемым. Деструктор ~Stack() выполняет действия, необходимые для корректного завершения работы с объектом, а именно: в деструкторе могут освобождаться динамически выделенная память, закрываться соединения с файлами и др. Он не имеет аргументов. Именем деструктора является имя класса, перед которым стоит знак "~" - тильда. Рассмотрим еще один пример класса, реализующего динамический односвязный список: #include // пример 12 #include struct Node{// объявление класса Node 8 int info; //информационное поле Node* next; // указатель на следующий элемент }; class List {// объявление класса List Node* top; // указатель на начало списка public: List(){ // конструктор top=0; cout<<"\nkonstructor:\n";}; ~List(){// деструктор release(); cout<<"\ndestructor:\n";} void push(int);// добавление элемента void del() {// удаление элемента Node* temp = top; top = top->next; delete temp;} void show(); void release();// удаление всех элементов }; void List::push(int i){ Node* temp = new Node; temp->info = i; temp->next =top; top=temp;} void List::show() { Node* temp=top; while (temp!=0) { cout<info<<"->"; temp=temp->next;} cout< List *p;//объявление указателя на LIst List st;//объявление объекта класса List int n = 0; cout « "Input an integer until 999:"; do {//добавление в список, пока не введено 999 cin » n; st.push(n); } while(n != 999); st.show(); st.del(); p=&st; p->show(); while(!kbhit()); return 0; } Необходимо отметить, что некоторый класс ClassA может использоваться до его объявления. В этом случае перед испльзованием класса ClassA нужно поместить его неполное объявление: class ClassA; Важнейшим принципом ООП является наследование. Класс, который наследуется, называется базовым, а наследуемый - производным. В следующем примере класс Derived наследует компоненты класса Base, точнее, компоненты раздела public, которые остаются открытыми, и компоненты раздела protected (защищенный), которые остаются закрытыми. Компоненты раздела private также наследуются, но являются недоступными напрямую для производного класса, которому доступны все данные и методы базового класса, наследуемые из разделов public и protected. Для переопределенных методов в производном классе действует принцип полиморфизма, который будет рассмотрен ниже. Объекту базового класса можно присвоить объект производного, указателю на базовый класс - значение указателя на производный класс. В этом случае через указатель на базовый класс можно получить доступ только к полям и функциям базового класса. Для доступа к полям и функциям порожденного класса следует привести (преобразовать) ссылку на базовый класс к ссылке на порожденный класс. #include <iostream.h> // пример 12 #include <conio.h> class Base {// определение базового класса int i; //private по умолчанию protected: int k; public: Base(){i=0;k=1;} void set_i(int n); // установка i int get_i(){ // возврат i return i;} void show(){ 10 cout<<" "< }; //конец Base class Derived : public Base {// производный класс intj; public: void set_j(int n); int mul(); //умножение i на k базового класса и на j производного }; //конец Derived //установка значения i в базовом классе void Base::set_i(int n){ i = n;} //установка значения j в производном классе void Derived::set_j(int n){ j = n;} //возврат i*k из Base умноженного на j из Derived int Derived::mul(){ /*производный класс наследует функции-члены базового класса*/ return j * get_i()*k;//вызов get_i() базового класса } int main(){ Derived ob; ob.set_i(10); //загрузка i в Base ob.set_j(4); // загрузка j в Derived cout « ob.mul()< Base bob=ob;//присваивание объекта ссылке на базовой тип cout< } Переменная i недоступна в производном классе, переменная k до ступна, поскольку находится в разделе protected. В производном классе наследуются также функции get i(), set_i() и show() класса Base из раз дела public. Функция show() позволяет получить доступ из производного класса к закрытой переменной i производного класса. В результате выво дится 40 10 1 10. Принцип полиморфизма, состоящий в перегрузке методов, объявленных в различных классах с одним и тем же именем и списком параметров, будет рассмотрен ниже. 11 КЛАССЫ И ФУНКЦИИ При реализации класса используются функции-члены класса (методы класса), функции-"друзья" класса, конструкторы, деструкторы, функции-операторы. Функции-члены класса объявляются внутри класса. Определение функции обычно размещается вне класса. При этом перед именем функции помещается операция доступа к области видимости имя_класса::. Таким образом, определение функции-члена класса имеет вид: тип имя_класса:: имя_функции (список аргументов) { } Определение функции может находиться и внутри класса вслед за его объявлением. Такие функции называются inline-функциями. Рассмотрим пример: #include // пример 20 #include #include #include #define SIZE 255 class Strtype { char *p; int len; public: Strtype(){// инициализация объекта, inline-конструктор p=new char [SIZE]; if(!p) {cout« "ошибка выделения памяти\n"; |
Учебно-методическое пособие для студентов специальностей «История» Шинаков Е. А., Поляков Г. П., Чубур А. А. Основы восточноевропейской археологии (учебно-методическое пособие). – Брянск, рио бгу,... |
Учебно-методическое пособие для проведения практических занятий для... Методы научных исследований: учебно-методическое пособие для проведения практических |
||
Очная форма обучения учебно-методическое пособие для курсантов юридического профиля подготовки Учебно-методическое пособие предназначено для курсантов юридического профиля подготовки специалистов (очной формы обучения) в Московском... |
Учебно-методическое пособие Н. Новгород ... |
||
Учебно-методическое пособие для студентов Нижний Новгород 2009 Темперамент, Характер. Воля: Учебно-методическое пособие для студентов. Н. Новгород: нгпу, 2009. 42с |
Соматопсихология учебно-методическое пособие по курсу «Соматопсихология» Соматопсихология: Учебно-методическое пособие по курсу «Соматопсихология» – Ульяновск: УлГУ, 2005 |
||
Конспект лекций по курсу "Информатика и использование компьютерных... Конспект лекций предназначен для студентов филологического факультета и факультета гуманитарных и социальных наук рудн. Конспект... |
Учебно-методические материалы по курсу «Уголовно-исполнительное право»... Учебно-методические материалы по курсу «Уголовно-исполнительное право» подготовлены на основе Уголовно-исполнительного кодекса Российской... |
||
План-конспект занятия; практикум; учебное пособие; учебник; учебно-методическое... «образование сегодня: актуальный опыт, методическое обеспечение, инновационные подходы» |
Международные валютные отношения и валютный рынок Методическое пособие Методическое пособие предназначено для студентов, обучающихся по специальности «Финансы и кредит» заочной формы обучения |
Поиск на сайте Главная страница Литература Доклады Рефераты Курсовая работа Лекции |