Программирование >>  Программирование на языке c++ 

1 ... 18 19 20 [ 21 ] 22 23 24 ... 159


{ my struct ms; объявление объекта ms

ms.init(IOO); вызов функции init для объекта ms cout << ms.getO endl; результат: 100

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

#include <iostream.h> struct my struct

{ static int a; объявление статического компонента- данного

int get(void);

int my struct::a = 200; инициализация статического

компонента-данного для глобальной структуры (класса)

int my struct::get() { return а; } void main(void) { my struct ms;

my struct *p=&ms;

cout p->get() endl; результат: 200 my struct::a = 300; изменение значения статического компонента

cout p->get() endl; результат: 300

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

#include <iostream.h>

char* s= external\n ; s - глобальная переменная void main(void)

{ char* s= internal\n ; s - локальная переменная cout << ::s; доступ к глобальной переменной результат; external

3 в. А. Скляров 65



cout << s; доступ к локальной переменной результат: internal

Четвертая программа показывает использование операторов .* и->*.

#include <iostream.h>

struct X

{ char* siliy function(void)

{ return 1 am useless\n ; }

void main(void) { Xob*p; p=&ob;

char* (X::*pointer to functlon)(void); объявление yкaзaтeля(pointer to function) на функцию, принадлежащую классу X

pointer to function = X::silly function; теперь pointer to function указывает на компонент-функцию

cout (ob.*pointer to function){); результат: I am

useless

cout (p->*pointer to function)(); результат: I am

useless

Рассмотрим эту программу подробнее. В объявлении: char* (X::*pointer to function)(void);

X - это имя структуры (класса). Конструкция char* (*p)(void) в языках C/C++ объявляет указатель р на функцию, не содержащую аргументов (void) и возвращающую указатель на символ (char*). В нашем примере вместо *р записано X::* pointer to function. Это говорит о том, что pointer to function - указатель на функцию, принадлежащую классу X. Все остальное описание будет таким же, как и для указателя р. Следующее выражение:

pointer to function = X::silly functlon;

присваивает pointer to function значение точки входа в функцию silly function, т. е. точки, с которой начинается вы-



полнение этой функции. Теперь можно выполнить функцию silly funetion, например, так:

(ob.*pointer to function){); или

(p->*pointer to function)();

Действительно, ведь это то же, что и ob.silly functionO или p->silly function(). Почему в выражениях выше используются дополнительные скобки? Да потому, что приоритеты операторов . -> О одинаковы (в последних выражениях) и выполняются эти операторы слева направо, а приоритет оператора О выше, чем операторов .* и ->*, которые надо выполнить раньше вызова функции. Действительно, сначала надо найти точку входа в функцию, например, точка входа= (ob.*pointer to function), а потом выполнить тело функции, например, так: точка входа().

Пятая программа демонстрирует использование оператора typeid, который можно записать в двух формах:

typeid(expression)

typeid(type name) где expression - выражение, type name - имя типа. #include <iostream.h>

#include <typeinfo.h> содержит описание класса

Typejnfo

class my ciass {}; объявление пустого класса

my class

void main{void) { int a;

double b;

my ciass x, *p;

cout << typeid(a).name() endl; результат: int cout typeid(b).name() endl; результат: double cout typeid{x).name() endl; результат: my class cout typeid(p).name() endl; результат: my class* if (typeid(a) == typeid(b)) сравнение типов

cout a and b are the same type\n ; else cout a and b are different types\n ;

результат: a and b are different types



1 ... 18 19 20 [ 21 ] 22 23 24 ... 159

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