Программирование >>  Структурное программирование 

1 ... 309 310 311 [ 312 ] 313 314 315 ... 342


не могут выполняться операции сравнения по тем же самым причинам, по каким они не выполняются над структурами.

Типичная ошибка программирования 18.3

Попытка сравнения объединений приводит к синтаксической ошибке, потому что компилятор не знает, какой элемент каждого объединения активен в настоящий момент и, следовательно, какие элементы объединений нужно выбирать для сравнения.

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

Типичная ошибка программирования 18.4

Инициализация объединения при его объявлении значением или выражением, тип которого отличается от типа первого элемента объединения.

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

В программе на рис. 18.8 объявляется переменная value типа объединения Number и выводятся значения обоих элементов этого объединения: как типа int, так и типа float. Вывод программы зависит от реализации системы. По результатам вывода программы видно, насколько сильно различается внутреннее машинное представление типов данных float и int.

Анонимное объединение - это объединение, которое не имеет имени типа и при определении которого перед завершающей точкой с запятой не задается имя объекта или указателя. При объявлении такого объединения создается не тип, а объект, не имеющий имени. К элементам анонимного объединения можно обращаться непосредственно по их именам в той области действия, в которой анонимное объединение объявлено, как к любым локальным переменным; при этом не нужно использовать операцию точка (.) или стрелка (->).

Анонимные объединения имеют некоторые ограничения. Они могут иметь только данные-элементы. Все элементы анонимного объединения должны иметь открытый уровень доступа. Глобальное анонимное объединение, область действия которого - файл, должно быть явно объявлено со спецификатором static.

На рис. 18.9 приводится пример использования анонимного объединения.



Пример использования объединения iinclude <iostream.h>

union Nuinber { int x; float y;

main() {

Number value; value.X = 100;

cout << Задание значения целого элемента << endl

и печать обоих элементов. endl int: value.X endl float: value.у endl;

value.у = 100.0;

cout Задание значения элемента с плавающей запятой << endl << и печать обоих элементов. << endl int: value.X endl float: value.у endl endl;

return 0;

Задсшие значения целого элемента

и печать обоих элементов.

int: 100

float: 3.5041б8в-16

Задание значения элемента с плавающей згшятой и печать обоих элементов, int: О float: 100

Рис. 18.8. Печать значения объединения при обоих типах данных-элементов

Использование анонимного объединения iinclude <iostream.h>

main ()

Объявление анонимного объединения

Заметьте, что элементы Ь, d и f разделяют

одну и ту же область памяти

union {

int b;

float d;

char *f;

Объявление обычных локальных переменных

int а = 1;

float с = 3.3;

char *е = Анонимное ;

Рис. 18.9. Использование анонимного объединения (часть 1 из 2)



return 0;

3.3 4.4

Анонимное обьединение

Рис. 18.9. Использование анонимного объединения (часть 2 из 2)

18.13. Спецификации связывания

в С++ имеется возможность вызывать из программы, написанной на С++, функции, написанные на С и откомпилированные компилятором С. Как мы уже говорили в разделе 3.20, С++ для обеспечения безопасного по отношению к типам редактирования связей особым образом кодирует имена функций. Язык С имена функций не кодирует. Таким образом, функция, откомпилированная компилятором С, не будет идентифицирована при попытке связать модули на С++ с модулями на С, так как С++ будет искать закодированное имя функции. Но программист на С++ имеет возможность, воспользовавшись спецификациями связывания, сообш;ить компилятору, что данная функция компилировалась на компиляторе С и запретить компилятору С++ кодировать ее имя. Спецификации связывания полезны в том случае, когда имеются большие разработанные ранее библиотеки специализированных функций и пользователь или не имеет доступа к исходным текстам этих библиотек для их перекомпиляции на С++, или у него нет времени на перенесение кода библиотеки в С++.

Для того, чтобы сообш;ить компилятору, что одна или несколько функций компилировались компилятором С, их прототипы должны быть объявлены следующим образом:

extern С прототип функции II одна функция

extern С несколько функций

прототипы функций

Эти объявления сообщают компилятору, что перечисленные функции компилировались не компилятором С++ и поэтому их имена кодировать не нужно. После компиляции программы на С++ указанные функции могут

Последовательное присваивание значения каждому элементу объединения и их вывод, cout а ; Ь = 2;

cout b endl;

cout с ; d = 4.4;

cout d endl;

cout e ; f = объединение ; cout f endl;



1 ... 309 310 311 [ 312 ] 313 314 315 ... 342

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