- •1. Понятие объектно-ориентированного программирования
- •2.Основные принципы ооп. Инкапсуляция
- •4. Конструкторы
- •Конструктор без параметров
- •Конструктор копирования
- •Деструкторы
- •Массивы объектов
- •Виртуальные методы
- •Использование классов функциональных объектов для настройки шаблонных классов
- •2. Стандартные потоки
- •3. Форматирование при вводе/выводе
- •4. Методы обмена с потоками
- •5. Ошибки потоков
- •6. Файловые потоки
- •7. Потоки и типы определяемые пользователем
- •Стандартная библиотека шаблонов stl (4 часа)
- •2. Контейнеры
- •3. Итераторы
2.Основные принципы ооп. Инкапсуляция
Рассмотрим структуру данных, которая хранит сведения о каком-либо человеке:
struct Person//описание структуры
{
char name[30];//имя
int age;//возраст
};
Person p;//переменная типа Person
Для того, чтобы ввести данные необходима функция Set_Person, которая заполняет поля этой структуры:
Person Set_Person(char*Name, int Age)
{
Person p;//локальная переменная
strcpy(p.name,Name);
p.age=Age;
return p;
}
Для того, чтобы вывести значения полей структуры необходима функция Print_Person:
void Print_Person(Person p)
{
cout<<p.name<<” “<<p.age<<”\n”;
}
Ф
Рисунок 1 Программа без использования
классов
void main()
{
…..
Person P;
char n1[30]=”Mickle”;
int age=12;
P=Set_Person(n1,a1);
Print_Person(p);
…….
}
Но эти функции не могут работать ни с какими другими переменными, кроме переменных типа Person, поэтому логично будет перенести их «внутрь» этой структуры (рис.2). Доступ к этим функциям осуществляется также как и доступ к обычным полям структуры(с помощью операций . и ->). Поля структуры в этом случае называют компонентными данными, а функции – методами или компонентными функциями.
struct Person
{
char name[30];
int age;
……
void Set_Person(char Name[30],int age)
{
strcpy(name,Name);
age=Age;
}
void Print_Person()
{
cout<<p.name<<” “<<p.age<<”\n”;
}
……..
}
Рисунок 2 Программаcиспользованием классов
Фрагмент функции main() будет иметь вид:
void main()
{
…..
Person P;
char n1[30]=”Mickle”;
int age=12;
P.Set_Person(n1,a1);//обращение к компонентной функции
P.Print_Person(p);
…….
}
Теперь нам не надо указывать переменную типа Person в качестве параметров функций Print_Person и Set_Person.
Реализуем поле name как динамический массив. Тип Person будет выглядеть следующим образом:
struct Person
{
char *name;
int age;
……
void Set_Person(char *Name, int age)
{
if(name!=0)delete name;
name=new char[strlen(Name)+1];
strcpy(name,Name);
age=Age;
}
void Print_Person()
{
cout<<p.name<<” “<<p.age<<”\n”;
}
….
};
Основная программа будет выглядеть следующим образом
void main()
{
…..
Person P;
char n1[30]=”Mickle”;
int age=12;
P.Set_Person(n1,a1);
P.Print_Person(p);
…….
}
Функция main() не изменилась, потому что не изменился интерфейс класса.
Описание классов
Класс является абстрактным типом данных, определяемым пользователем, и представляет собой модель реального объекта в виде данных и функций для работы с ними.
Данные класса называются полями (по аналогии с полями структуры), а функции класса — методами. Поля и методы называются элементами класса. Описание класса в первом приближении выглядит так:
class <имя>{ [ private: ]
<описание скрытых элементов> public:
<описание доступных элементов> }; // Описание заканчивается точкой с запятой
Спецификаторы доступа private и public управляют видимостью элементов класса. Элементы, описанные после служебного слова private, видимы только внутри класса. Этот вид доступа принят в классе по умолчанию. Интерфейс класса описывается после спецификатора public. Действие любого спецификатора распространяется до следующего спецификатора или до конца класса. Можно задавать несколько секций private и public, порядок их следования значения не имеет.
Видимостью элементов класса можно также управлять с помощью ключевых слов struct и class. Если при описании класса используется слово struct, то все поля и методы по умолчанию будут общедоступными (public). Если при описании класса используется слово class, то по умолчанию все методы и поля класса будут скрытыми (private).
Все методы класса имеют непосредственный доступ к его скрытым полям.
Свойства полей класса:
могут иметь любой тип, кроме типа этого же класса (но могут быть указателями или ссылками на этот класс);
могут быть описаны с модификатором const, при этом они инициализируются только один раз (с помощью конструктора) и не могут изменяться;
Инициализация полей при описании не допускается.
Если тело метода определено внутри класса, он является встроенным (inline). Как правило, встроенными делают короткие методы. Если внутри класса записано только объявление (заголовок) метода, сам метод должен быть определен в другом месте программы с помощью операции доступа к области видимости (::):
class Person
{
char name[30];
int age;
public:
void Set_Person(char *Name,int age);
void Print_Person()//встроенная функция
{
cout<<p.name<<” “<<p.age<<”\n”;
}
….
};
void Person::Set_Person(char *Name,int age);
{
if (name!=0) delete[]name;
name=new char[strlen(Name)+1];
strcpy(name,Name);
age=Age;
}