|
Программирование >> Процедурные приложения
связыванию, осуществляемому во время компиляции. В процессе связывания имена функций заменяются их адресами. При вызове виртуальных функций используется специальная таблица адресов функций, называемая виртуальной таблицей. Она инициализируется в ходе выполнения программы в момент создания объекта конструктором класса. Роль конструктора заключается в том, чтобы связать виртуальную функцию с правильной таблицей адресов. Во время компиляции адрес виртуальной функции не известен, но известна ячейка виртуальной таблицы, где этот адрес будет записан во время выполнения программы. Первое знакомство с классом В этом параграфе мы на простых примерах детально разберем, чем же все-таки класс отличается от структуры. Структура в роли примитивного класса Структуры в C++ можно рассматривать как примитивные классы, поскольку они могут содержать не только данные, но и функции. Рассмотрим следующую программу: sqroot.cpp В этой программе на языке C++ создается структура, содержащая, кроме данных, также функции. #include <iostream.h> # include <math.h> struct math operations { double data value; void set value (double value) { data value = value; } double get square (void) { return (data value * data value) ; } double get square root (void) { return (sqrt (data value) }; } } math; main () записываем в структуру число 35.63 math.set value (35.63); cout << Квадрат числа равен << math.get square () << endl; cout << Корень числа равен << math.get square root () << endl; return (0); } В первую очередь обратите внимание на то, что помимо переменной структура содержит также несколько функций. Это первый случай, когда внутри структуры нам встретились описания функций. Такая возможность существует только в C++. Функции-члены структуры могут выполнять операции над переменными этой же структуры. Неявно подразумевается, что все члены структур являются открытыми, как если бы они были помещены в секцию public. При выполнении программы на экране отобразится следующая информация: Квадрат числа равен 1269.5 Корень числа равен 5.96909 В структуре math operation объявлена единственная переменная-член data value и три функции, описание которых дано тут же внутри структуры. Первая функция отвечает за инициализацию переменной data value, другие возвращают соответственно квадрат и квадратный корень числа, хранимого в переменной. Обратите внимание, что последние две функции не принимают никаких значений, поскольку переменная data value доступна для них как член структуры. В следующей программе вновь создается структура, содержащая функции, но на этот раз они описаны вне структуры. trigon.cpp 228 В этой программе на языке C++ создается структура, содержащая тригонометрические функции. #include <iostream.h> #include <math.h> const double.DEG TO RAD = 0.0174532 925; struct degree { double data value; void set value (double angle); double get sine (void) ; double get cosine (void) ; double get tangent (void) ; double get cotangent (void) ; double get secant (void) ; double get cosecant (void) ; ) deg; void degree: :set value (double angle) { data value = angle; double degree: :get sine (void) { return (sin(DEG TO RAD * data value) ) double degree::get cosine(void) { return(cos(DEG TO RAD * data value)); } double degree : : get tangent (void) { return ( tan (DEG TO RAD * data value) ) ; } double degree: :get secant (void). { return (1.0/ sin(DEG TO RAD * data value) ) ; } double degree: :get cosecant (void) ( return (1.0/ cos(DEG TO RAD * data value) ) ; ) double degree : : get cotangent (void) < return (1.0/ tan(DEG TO RAD * data value) ) ; } main() { устанавливаем значение угла равным 25 градусов deg . set value ( 25.0 ) ; cout << Синус угла равен << deg.get sine () << endl; cout << Косинус угла равен << deg.get cosine () << endl; cout << Тангенс угла равен << deg.get tangent () << endl; cout << Секанс угла равен << deg.get secant () << endl; cout << Косеканс угла равен << deg.get cosecant () << endl; cout << Котангенс угла равен << deg.get cotangent () << endl; return (0 ); } В этой программе структура содержит прототипы семи функций, но сами они описаны отдельно. Тригонометрические функции вычисляют синус, косинус, тангенс, котангенс, секанс и косеканс угла, значение которого в градусах передается в функцию set value(). Здесь следует обратить внимание на синтаксис заголовка функции, например: void degree::set value(double angle) Имя функции состоит из имени структуры, за которым расположен оператор : :.. При вызове функции используется оператор точка (.), как и при доступе к переменным-членам структуры. Если бы структура была представлена указателем, доступ к функциям необходимо было бы осуществлять с помощью оператора ->. Синтаксис описания классов Синтаксис описания класса подобен синтаксису описания структуры. Оно начинается с ключевого слова class, за которым следует имя класса, становящееся именем нового типа данных. В простейшем случае описание класса можно представить так: class имя { тип1 переменная1 тип2 леременная2 типЗ переменнаяЗ public: метод1; метод2; методЗ; По умолчанию все члены класса считаются закрытыми и доступ к ним могут получить только функции-члены этого же класса. Это именно то, что в C++ отличает классы от структур: все члены структур по умолчанию являются открытыми. Если необходимо изменить тип доступа к членам класса, перед ними следует указать один из спецификаторов доступа: public, protected или private. Ниже показано описание класса, который будет использоваться в следующем примере программы: class degree ( double data value; public: void set value(double);
Здесь создается новый тип данных degree. Закрытая переменная-член data value доступна только функциям-членам класса. Одновременно создается и объект данного класса - переменная deg. He показалось ли вам описание класса знакомым? Это, по сути, та же самая структура, которую мы рассматривали в предыдущем примере, лишь ключевое слово class превращает структуру в настоящий класс. Простейший класс Рассмотрим следующий пример программы: class. срр В этой программе на языке C++ создается простейший класс, имеющий открытые и закрытые члены. #include <iostream.h> #include <math.h> const double DEG TO RAD = 0.0174532 925; class degree ( double data value; public: void set value(double angle); double get sine(void) ; double get cosine(void) ; double get tangent(void) ; double get secant(void) ; double get cosecant(void) ; double get cotangent(void); ) deg; void degree::set value(double angle) < data value = angle;
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |