Создание классов и объектов
Оператор объявления класса имеет вид: 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 Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|