Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции C++.doc
Скачиваний:
0
Добавлен:
06.02.2020
Размер:
1.44 Mб
Скачать

3.6 Анонимные объединения

Одной из интересных разновидностей объединений в языке C++ является анонимное объедине­ние. Оно не поддерживается в языке С. Анонимное объединение (anonymous union) представляет собой объединение, у которого нет имени или объектов, имеющих это объединение в качестве своего типа. Имена членов этого объединения доступны непосредственно без использования опе­ратора точка или оператора стрелка. Ниже представлен короткий пример, использующий ано­нимное объединение:

#include <iostream.h>

int main()

{

union

{ // нет имени объединения

int i;

char ch[4];

}; // не указаны переменные

/* обращение к i и ch без ссылки на объединение

и без использования операторов точка или стрелка */

i = 88;

cout << i << " " << ch[0];

return 0;

}

На использование анонимных объединений имеется несколько ограничений. По очевидным причинам имена членов анонимного объединения должны отличаться от всех остальных иденти­фикаторов в области видимости объединения. Это означает, что имена членов объединения не должны конфликтовать с остальными идентификаторами в пределах области видимости объеди­нения. Также глобальные анонимные объединения должны вводиться с ключевым словом static. Анонимные объединения не могут содержать функций-членов. Наконец, анонимные объедине­ния не могут включать частных или защищенных (protected) членов.

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

3.7 Inline-функции

Хотя это и не относится в полной мере именно к объектно-ориентированному программирова­нию, одной из очень важных особенностей языка C++, которую нельзя найти в С, служит исполь­зование inline-функций. inline-функция — это такая функция, чье тело подставляется в каждую точ­ку вызова, вместо того, чтобы генерировать код вызова. Это подобно использованию параметризованных макросов в С. Имеются два способа создания inline-функций. Первый заключа­ется в использовании модификатора inline. Например, для создания inline-функции f, возвращаю­щей значение типа int и не имеющей параметров, достаточно объявить ее следующим образом:

inline int f();

Общая форма объявления inline-функций следующая:

inline объявление_функции;

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

#include <iostream.h>

class C

{

int i;

public:

int get_i();

void put_i(int j);

};

inline int C::get_i()

{

return i;

}

inline void C::put_i(int j)

{

i = j;

}

int main()

{

C s;

s.put_i(10);

cout << s.get_i();

return 0;

}

Важно ясно понимать, что технически inline представляет запрос к компилятору сгенерировать подставляемый код; inline не является командой. В некоторых ситуациях компилятор не будет выполнять этот запрос. Например, некоторые компиляторы не подставляют функции, содержа­щие циклы, switch, операторы goto, функции, использующие исключе­ния или имеющие в качестве параметра объект, содержащий деструктор, функции, возвращающие объекты, имеющие деструкторы.