Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
117
Добавлен:
10.12.2013
Размер:
856.06 Кб
Скачать

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 Программа без использования классов

рагмент функцииmain() будет иметь вид:

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() не изменилась, потому что не изменился интерфейс класса.

  1. Описание классов

Класс является абстрактным типом данных, определяемым пользователем, и представляет собой модель реального объекта в виде данных и функций для работы с ними.

Данные класса называются полями (по аналогии с полями структуры), а функ­ции класса — методами. Поля и методы называются элементами класса. Описа­ние класса в первом приближении выглядит так:

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;

}

Соседние файлы в папке II cemecTP