|
Программирование >> Инициализация объектов класса, структура
Type ID Assign Constant Semicolon парсеру увидеть следующее: (Тип ИД Присваивание Константа Точка с запятой) Далее парсер анализирует значения каждой лексемы. В данном случае он видит: Указатели на члены можно также объявлять как данные-члены класса. Модифицируйте определение класса Screen так, чтобы оно содержало указатель на его функцию-член того же типа, что home() и end() . Упражнение 13.15 Модифицируйте имеющийся конструктор класса Screen (или напишите новый) так, чтобы он принимал параметр типа указателя на функцию-член класса Screen, для которой список формальных параметров и тип возвращаемого значения такие же, как у home() и end() . Реализуйте для этого параметра значение по умолчанию и используйте параметр для инициализации члена класса, описанного в упражнении 13.14. Напишите функцию-член Screen, позволяющую пользователю задать ее значение. Упражнение 13.16 Определите перегруженный вариант repeat(), который принимает параметр типа cursorMovements. 13.7. Объединение - класс, экономящий память Объединение - это специальный вид класса. Данные-члены хранятся в нем таким образом, что перекрывают друг друга. Все члены размещаются, начиная с одного и того же адреса. Для объединения отводится столько памяти, сколько необходимо для хранения самого большого его члена. В любой момент времени можно присвоить значение лишь одному такому члену. Рассмотрим пример, иллюстрирующий использование объединения. Лексический анализатор, входящий в состав компилятора, разбивает программу на последовательность лексем. Так, инструкция int i = 0; преобразуется в последовательность из пяти лексем: 1. Ключевое слово int. 2. Идентификатор i. 3. Оператор = 4. Константа 0 типа int. 5. Точка с запятой. Лексический анализатор передает эти лексемы синтаксическому анализатору, парсеру, который идентифицирует полученную последовательность. Полученная информация должна дать парсеру возможность распознать эту последовательность лексем как объявление. Для этого с каждой лексемой ассоциируется информация, позволяющая Type <==> int ID <==> i Constant <==> 0 Для Assign и Semicolon дополнительной информации не нужно, так как у них может быть только одно значение: соответственно := и ; . Таким образом, в представлении лексема: могло бы быть два члена - token и value. token - это уникальный код, ноказ1вающий, что лексема имеет тин Type, ID, Assign, Constant или Semiicolon, например 85 для ID и 72 для Semiicolon.value содержит конкретное значение лексемы. Так, для лексемы ID в предыдущем объявлении value будет содержать строку i , а для лексема: Type - некоторое представление тина int. Представление члена value несколько проблематично. Хотя для любой отдельной лексемы в нем хранится всего одно значение, их типы для разных лексем могут различаться. Для лексемы ID в value хранится строка символов, а для Constant - целое число. Конечно, для хранения даннгх нескольких типов можно использовать класс. Разработчик компилятора может объявить, что value принадлежит к типу класса, в котором для каждого типа данных есть отдельный член. Применение класса решает проблему представления value. Однако для любой данной лексемы value имеет лишь один из множества возможных типов и, следовательно, будет задействован только один член класса, хотя памяти выделяется столько, сколько нужно для хранения всех членов. Чтобы намять резервировалась только для нужного в данный union TokenValue { char cval; int ival; char * sval; double dval; double момент члена, применяется объединение. Вот как оно определяется: Если самым большим типом среди всех членов TokenValue является dval, то размер TokenValue будет равен размеру объекта типа double. По умолчанию члены объединения открыты. Имя объединения можно использовать в программе всюду, где объект типа TokenValue TokenValue last token; указатель на объект типа TokenValue допустимо имя класса: TokenValue *pt = new TokenValue; Обращение к членам объединения, как и к членам класса, производится с помощью операторов доступа: last token. ival = 97; char ch = pt-> cval; union TokenValue { public: char cval; ... private: int priv; int main() { TokenValue tp; tp. cval = \n; правильно ошибка: main() не может обращаться к закрытому члену TokenValue::priv tp.priv = 1024; Члены объединения можно объявлять открытыми, закрытыми или защищенными: У объединения не бывает статических членов или членов, являющихся ссылками. Его членом не может быть класс, имеющий конструктор, деструктор или копирующий union illegal members { Screen s; ошибка: есть конструктор Screen *ps; правильно static int is; ошибка: статический член int srfi; ошибка: член-ссылка оператор присваивания. Например: Для объединения разрешается определять функции-члены, включая конструкторы и деструкторы:
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |