Программирование >>  Процедурные приложения 

1 ... 73 74 75 [ 76 ] 77 78 79 ... 150


связыванию, осуществляемому во время компиляции. В процессе связывания имена функций заменяются их адресами.

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

Первое знакомство с классом

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

Структура в роли примитивного класса

Структуры в 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);

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;

Здесь создается новый тип данных 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;



1 ... 73 74 75 [ 76 ] 77 78 79 ... 150

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика