|
Программирование >> Программирование на языке c++
{ 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
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |