Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Создание классов и объектов




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

class <имя класса>: [<режим доступа>] <имя родительского класса>

{ [ private: <поля, методы, свойства и события, доступные только в классе>]

[ protected: <аналогичен private, и дополнительно доступный потомкам>]

[ public: <поля, методы, свойства и события, доступные всем >]

[ _published: <аналогичен public и изменяемый в Инспекторе Объектов>]

[ friend <дружественные функции>]

}; //окончание объявления класса

Режим доступа задается словами: private /public (защищенные имена остаются защищенными, а общедоступные имена родительского класса недоступны/доступны в производном классе).

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

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

Объект объявляется в разделе переменных оператором вида:

<имя класса> <имя объекта>;

Доступ к полям, свойствам и методам объекта реализуется указа­нием имени объекта, стрелочки (->) и имени поля, свойства или метода.

Пример задания значения свойству Caption объекта Button1:

Button1->Caption:=«Выход»; //надпись командной кнопки «Выход»

Конструктор/деструктор ‑ специальные методы, создающие/ун­ич­тожающие объекты. Они отличаются от обычных методов следующими осо­бенностями: имеют имя, совпадающее с именем своего класса (у дес­трук­­тора перед именем указывается символ тильда «~»); автоматически вы­зы­вают­ся компилятором; не имеют возвращаемого зна­че­ния, не могут нас­ле­до­вать­ся, хотя могут вызываться из производного класса; по умол­ча­нию имеют атрибут public; конструкторы не могут быть виртуальными.

Конструкторы бывают трех типов:

конструктор по умолчанию не имеет параметров, и при его явном отсут­ст­вии в классе создается автоматически компилятором;

конструктор с параметрами позволяет в момент создания объекта вы­зы­вать различные функции и передавать им значения через параметры;

конструктор копирования позволяет создавать новый объект путем ко­пи­рования из другого существующего объекта этого класса (формирова­ние динамических структур).

Операция доступа к области действия (::) задается в виде:

:: <имя глобальной переменной> или <имя класса> :: <имя функции>

Первая форма позволяет обратиться к глобальной переменной, если она даже закрыта одноименой локальной переменной (::x:=12.6).

Вторая форма обозначает, что функция, хотя и определена вне ука­зан­ного класса, является методом данного класса и существует в области дей­ствия этого класса (TForm1::Button1Click(TObject *Sender)).

Пример создания и использования классов: Circle (вывод данных о круге) и производного из него класса Cylinder (вывод данных о цилиндре).

const double pi=3.14159265358979; // объявление константы pi

class Circle // объявление класса Circle ‑ вывода радиуса и площади круга

{ protected: double r; // объявление переменной со значением радиуса круга

public: // общедоступные методы и переменные класса Circle

Circle(double rVal=0) // заголовок конструктора класса с параметром rVal

: r(rVal) // при создании объекта Circle значению r присваивается rVal

{ } // пустое тело метода; можно было и так: Circle(double rVal=0){r=rVal;}

void setRadius(double rVal) {r=rVal;} // метод установки значения r

double getRadius() {return r;} // метод возвращения значения радиуса r

double Area() {return pi*r*r;} // метод вычисления площади круга

void showData(); // объявление метода вывода данных о круге

}; // окончание объявления класса Circle

// объявление производного класса Cylinder из класса Circle

class Cylinder: public Circle // класс Cylinder выводит данные о цилиндре

{protected:double h; //объявление переменной h‑значение высоты цилиндра

public: // общедоступные методы и переменные класса Cylinder

Cylinder (double hVal=0, double rVal=0) // заголовок конструктора класса

: h(hVal), // при создании объекта Cylinder значению h присваивается hVal

Circle(rVal){ } // вызов конструктором класса Cylinder конструктора Circle

void setHeight(double hVal) {h=hVal;} // метод установки значения h

double getHeight () {return h;} // метод, возвращающий значение h

// метод вычисления поверхности цилиндра. Circle::Area() перезагружает

//унаследованную функцию класса Circle для вычиcления площади

//основания цилиндра.

double Area() {return 2*Circle::Area()+2*pi*r*h;} // площадь цилиндра

void showData(); // объявление метода вывода данных о цилиндре

}; // окончание объявления класса Cylinder

void Circle::showData() // заголовок метода в Circle вывода данных о круге

{cout << «Радиус круга = «<<getRadius()<<endl // вывод значения радиуса

<< «Площадь круга = «<< Area()<<endl <<endl; // вывод площади круга

} // конец метода Circle::showData

void Cylinder::showData() // метод в Cylinderвывода данных о цилиндре

{cout << «Радиус основания = «<< getRadius() << endl // вывод радиуса

<< «Высота цилиндра = «<< getHeight() << endl // вывод высоты

<< «Площадь поверхности=«<< Area() << endl; // вывод площади

} // конец метода Cylinder::showData

int main(int argc,char **argv) // основная процедура тестирования классов

{Circle circle(4); // создания объекта circle класса Circle (круг радиусом 4)

Cylinder cylinder(9,3); //создания объекта cylinder класса Сylinder (цилиндр)

circle.showData(); // вывод данных о круге методом showData класса circle

cylinder.showData(); // вывод данных о цилиндре методом cylinder.showData

getch(); return 0; // остановка и завершение работы функции

} // конец функции тестирования классов и объектов

Виртуальные методы

Виртуальные методы позволяют родительским методам обра­щать­ся к одноименным методам потомков, так как их можно переопределить в потомке (позднее связывание). В начале объявления виртульного метода (функции) ука­зы­вается ключевое слово virtual (это слово можно не указы­вать в производных классах). Список параметров и типы параметров у вир­туль­ных функций должны быть одинаковыми (в противном случае нужно использовать перегруженные функции).

Пример виртульного метода и позднего его связывания:

class Parent // объявление родительского класса Parent

{ public: // общедоступные методы и переменные класса Parent

virtual double Fun1(double x) {return x*x;} // виртуальный метод Fun1

double Fun2(double x) {return Fun1(x)/4;} // обычный метод Fun2

}; // окончание объявления класса Parent

class Child: public Parent // объявление потомка Parent из класса Child

{public: // общедоступные методы и переменные класса Child

virtual double Fun1(double x) {return x*x*x;} // виртуальный метод Fun1

}; // окончание объявления класса Child

int main(int argc, char **argv) // основная процедура тестирования классов

{ Child child; // создания объекта child класса Child

// Вывод значения функции, наследуемой из родительского класса Parent

// Fun2(4), которая в свою очередь вызовет переопределенную виртуаль­//ную функцию Fun1 потомка Child (Child::Fun1), а не родительскую //функцию Fun1 (Parent::Fun1).

cout << child.Fun2(4) << endl; // вывод значения 16

getch(); return 0; // задержка и завершение работы функции тестирования

} // конец функции тестирования

Дружественные функции

Дружественные фукции имеют доступ ко всем защищенным и при­ват­ным членам данных внешних классов. Объявление их имеет вид:

FriendreturnType <имя функции> ( <параметры> ). Оператор вызова функ­ции имеет вид: <имя функции> (& <имя экземпляра класса с функцией> ).

Шаблоны

Шаблоны позволяют создавать семейство функций или классов:

Template< список шаблонных типов > { <объявление> };

Шаблон функций задает образец объявлений перегруженных фун­кций (типы аргу­ментов и результатов работы функции могут меняться при ее различных вызовах) (п. 6.2.7). Фактичес­кие типы должны быть известны во время компиляции.

Пример шаблона функцииmaxim (нахождение наиболь­ше­го числа из двух чисел, все аргументы и результат имеют пе­ре­менный тип T):

template <class T> T maxim (T x,T y) // шаблон функции maxim

{ return (x > y)? x: y;} // тело функции maxim

int main(int argc, char **argv) // основная функция проверки шаблона

{ int i=2; int j=maxim(i,0); // аргументы функции maxim типа int

float a=3.2,b=8.6;float m=maxim(a,b); //аргументы функции maxim типа float

cout << j << endl; cout << m <<endl; getch(); return 0; // вывод результатов

} // конец функции

Шаблон классов задает образец определений семейства классов.

Пример шаблона Vector ‑ генератор классов одномерных массивов.

template <class T> class Vector;

Пространство имен

Механизм пространства внешних (глобальных) имен позволяет раз­бить приложе­ние на отдельные пространства, в каждом из которых можно определить свои глобальные иден­тификато­ры. Последние не зависят от других прост­ранств. Каждое пространство начинается со строки:

namespace <идентификатор подсистемы> { [<объявления>] }.

Существуют три способа доступа к элементам подсистем:

1. Явная в виде <имя подсистемы> :: <переменная, функция> (first::nds).

2. Доступ ко всем элементам в виде using namespace:: <имя подсистемы> (using namespace:: first).

3. Объявление нового идентификатора в локальном пространстве имен в ви­де: using:: <новое имя> (using:: nds;).

Пример:

namespace first { int i=10, j=11; } // объявление пространства first

int main(int argc, char **argv) // основная функция тестирования

{ cout << first::i << endl; // вывод переменной i=10 из пространства first

using namespace:: first; // доступ ко всем переменным пространства first

cout << j << endl; // вывод переменной j=11 из пространства first

getch(); return 0; // задержка и выход из функции

} // конец тела основной функции

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...