Создание классов и объектов
Оператор объявления класса имеет вид:
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; // задержка и завершение работы функции тестирования
} // конец функции тестирования
Дата добавления: 2016-03-22; просмотров: 647;