Объектно-ориентированное программирование

Объявление и определение классов

Класс (class) - составной тип данных, содержащий поля и методы. Поля и методы могут использоваться извне класса, например, при вызове методов в том месте, где класс был создан. Поля и методы класса также могут использоваться внутри самого класса в его методах. Для ограничения доступа к внутреннему устройству класса извне существуют модификаторы доступа:

  • • 'public' - поля и методы доступны извне класса
  • • 'private' - поля и методы закрыты извне и доступны только внутри класса
  • • 'protected' - аналогично предыдущему, поля и методы закрыты для доступа извне (есть отличия при наследовании классов, которые будут описаны в соответствующем разделе)

Внутри класса все его содержимое, и поля и методы, всегда доступны. Т.е. метод может обращаться к любым данным и другим методам своего класса независимо от их модификатора доступа. Класс не отличается от структуры (struct) ничем, кроме того что по умолчанию в структуре все члены открыты (public), а в классе все члены закрыты (private).

Для того чтобы в порядке исключения дать доступ к закрытым или защищенным членам класса определенным другим классам или внешним функциям можно указать их как дружественные. Это делается с помощью ключевого слова 'friend'. class С {

friend double square(double x); //функция теперь может использовать

//закрытые и защищенные члены объектов

//класса С

friend class D; //класс D получил доступ к закрытым и защищенным

// членам объектов класса С

friend int E::mod(); // дружественный метод класса

};

Раздел 'public', 'private', или 'protected' класса, в котором сделаны объявления дружественности роли не играет.

Определение полей (данных) класса происходит так же как и определение любых объектов , но делается это внутри класса: //c.h class С {//по умолчанию все поля закрыты public:

double х,у; //открытые поля класса protected:

string description; //защищенные поля класса private:

double х2,у2; //закрытые поля класса };

Доступ к полям осуществляется с помощью селекторов доступа '.' для объекта класса или для указателя на объект класса.

//main, срр

//include "c.h" int main() {

C obj, pobj={&objj;

obj.x = 0.0; //Изменение открытых полей

obj.у = 0.0;

pobj->x = 1.0; // Ona, снова поменяли

pobj->y = 1.0;

obj.x2 = 0; // Ошибка. Доступ закрыт. }

Объявление и определение методов класса происходит подобно объявлению и определению функций, но только внутри класса //c.h class С { public:

double х,у; // открытые поля из предыдущего примера

double mod(); //открытый метод класса, здесь только объявление,

// определение метода (тело функции) сделано отдельно, хотя

//можно было бы определить здесь protected:

string description; //метод 'mod()' имеет доступ к этому полю private: double x2,y2; // и к этим полям тоже, а извне к ним доступа нет };

Метод, объявленный в классе, но не определенный там же, должен быть определен отдельно. Определение вне класса дается аналогично определению функции, но добавляется оператор разрешения доступа указывающий на то, что метод определен внутри класса. Имя класса указывается в определении.

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

//с.срр

ttinclude "c.h" //включение заголовка для использования объявлений класса 'С

double С::mod() // определение метода <имя класса>::<имя метода> {

х2 = х*х; //внутри методов класса доступ к другим полям и методам

// осуществляется без селектора доступа. Здесь это

// иллюстрирует запись значений в 'х2' и 'у2'.

У 2 = у*у;

return( squareroot(x2+y2));

}

//main.cpp

^include "c.h"//снова включение того-же заголовка для того, чтобы ниже

// создать объект класса 'С

int main()

{

С objl, obj2;

objl.x = 0.0; // Изменение открытых полей

objl.у = 0.0;

obj2.x = 1.0; // Изменение открытых полей

ohj2.y = 1.0;

double absl = objl.mod(); //вызов метода класса первого объекта

double abs2 = obj2.mod(); //вызов того же метода для второго объекта

}

Вот в этом месте очень важно понять различие между классом и объектом. Класс определяет тип и свойства типа - поля и методы. Объект является экземпляром класса и имеет все свойства класса при этом значение этих свойств у каждого экземпляра может быть разным. У одного класса может быть множество объектов.

 
Посмотреть оригинал
< Пред   СОДЕРЖАНИЕ ОРИГИНАЛ   След >