Server for Information Technologies Сервер поддерживается
Центром Информационных Технологий
(095) 932-9212, 932-9213, 939-0783
E-mail: info@citforum.ru
Сервер содержит море(!) аналитической информации CIT Forum CD-ROM

17. Свободная память

Операция new (#7.2) вызывает функцию

	extern void* _new (long);
для получения памяти. Параметр задает число требуемых байтов. Память будет инициализирована. Если _new не может найти требуемое количество памяти, то она возвращает ноль.

Операция delete вызывает функцию

	 extern void _delete (void*);
чтобы освободить память, указанную указателем, для повторного использования. Результат вызова _delete() для указателя, который не был получен из _new(), не определен, это же относится и к повторному вызову _delete() для одного и того же указателя. Однако уничтожение с помощью delete указателя со значением ноль безвредно.

Предоставляются стандартные версии _new() и _delete(), но пользователь может применять другие, более подходящие для конкретных приложений.

Когда с помощью операции new создается классовый объект, то для получения необходимой памяти конструктор будет (неявно) использовать new. Конструктор может осуществить свое собственное резервирование памяти посредством присваивания указателю this до каких-либо использований. С помощью присваивания this значения ноль деструктор может избежать стандартной операции дерезервирования памяти для объекта его класса. Например:

	class cl
	  {
	    int v[10];
	    cl () { this = my_own_allocator (sizeof (cl)); }
	    ~cl () { my_own_deallocator (this); this = 0; }
	  }

На входе в конструктор this является не-нулем, если резервирование памяти уже имело место (как это имеет место для автоматических объектов), и нулем в остальных случаях.

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

18. Краткое изложение синтаксиса

Мы надеемся, что эта краткая сводка синтаксиса C++ поможет пониманию. Она не является точным изложением языка.

18.1 Выражения

	   выражение:
	     терм
	     выражение           бинарная_операция           выражение
	     выражение       ?       выражение       :       выражение
	     список_выражений
	терм:
	     первичный
	     *                                                    терм
	     &                                                    терм
	     -                                                    терм
	     !                                                    терм
	     ~                                                    терм
	     ++терм
	     --терм
	     терм++
	     терм--
	     (                   имя_типа)                   выражение
	     имя_простого_типа           (           список_выражений)
	     sizeof                                          выражение
	     sizeof             (              имя_типа              )
	     new                                              имя_типа
	     new ( имя_типа )
	первичный:
	     id
	     ::                                          идентификатор
	     константа
	     строка
	     this
	     (                       выражение                       )
	     первичный[                  выражение                   ]
	     первичный      (       список_выражений       opt       )
	     первичный.id
	     первичный->id
	id:
	     идентификатор
	     typedef-имя :: идентификатор
	список_выражений:
	     выражение
	     список_выражений, выражение
	операция:
	     унарная_операция
	     бинарная_операция
	     специальная_операция
Бинарные операции имеют приоритет, убывающий в указанном порядке:
	бинарная_операция:
	     *                          /                            %
	     +                                                       -
	     <<                                                     >>
	     <                                                       >
	     ==                                                     !=
	     &
	     ^
	     |
	     &&
	     ||
	     =   +=  -=  *=  /=  %=  ^=  &=  |=  >>=  <<=
	унарная_операция:
	      *   &   -   ~   !   ++   --
	специальная_операция:
	     ()       []
	имя_типа:
	     спецификаторы_описания абстрактный_описатель
	абстрактный_описатель:
	     пустой
	     *                                   абстрактный_описатель
	     абстрактный_описатель  (   список_описаний_параметров   )
	     абстрактный_описатель  [   константное_выражение  opt   ]
	     ( абстрактный_описатель )
	простое_имя_типа:
	     typedef-имя
	     char
	     short
	     int
	     long
	     unsigned
	     float
	     double
	typedef-имя:
	     идентификатор

18.2 Описания

	описание:
	     спецификаторы_описания  opt   список_описателей   opt   ;
	     описание_имени
	     asm-описание
	описание_имени:
	     агрег                   идентификатор                   ;
	     enum  идентификатор ;
	агрег:
	     class
	     struct
	     union
	asm-описание:
	     asm ( строка );
	спецификаторы_описания:
	     спецификатор_описания спецификатор_описания opt
	спецификатор_описания:
	     имя_простого_типа
	     спецификатор_класса
	     enum_спецификатор
	     sc_спецификатор
	     фнк_спецификатор
	     typedef
	     friend
	     const
	     void
	sc_спецификатор:
	     auto
	     extern
	     register
	     static
	фнк-спецификатор:
	     inline
	     overload
	     virtual
	список_описателей:
	     иниц-описатель
	     иниц-описатель , список_описателей
	иниц-описатель:
	     описатель инициализатор opt
	описатель:
	     оп_имя
	     (                       описатель                       )
	     *             const             opt             описатель
	     &             const             opt             описатель
	     описатель      (       список_описаний_параметров       )
	     описатель [ константное_выражение opt ]
	оп_имя:
	     простое_оп_имя
	     typedef-имя . простое_оп_имя
	простое_оп_имя:
	     идентификатор
	     typedef-имя
	     -                                             typedef-имя
	     имя_функции_операции
	имя_функции_операции:
	     операция операция
	список_описаний_параметров:
	     список_описаний_прм opt ... opt
	список_описаний_прм                                          :
	     список_описаний_прм         ,          описание_параметра
	     описание_параметра
	описание_параметра:
	     спецификаторы_описания                          описатель
	     спецификаторы_описания описатель = константное_выражение
	спецификатор_класса:
	     заголовок_класса       {список_членов        opt        }
	     заголовок_класса    {список_членов     opt    public    :
	список_членов opt }
	заголовок_класса                                             :
	     агрег                  идентификатор                  opt
	     агрег идентификатор opt : public opt typedef-имя
	список_членов                                                :
	     описание_члена список_членов opt
	описание_члена:
	     спецификаторы_описания opt описатель_члена ;
	описатель_члена:
	     описатель
	     идентификатор opt : константное_выражение
	инициализатор:
	     =                                               выражение
	     =                {                список_инициализаторов}
	     =       {        список_инициализаторов,                }
	     (список_выражений )
	список_инициализаторов                                       :
	     выражение
	     список_инициализаторов        ,    список_инициализаторов
	     { список_инициализаторов }
	enum-спецификатор:
	     enum идентификатор opt { enum-список }
	enum-список:
	     перечислитель
	     enum-список , перечислитель
	перечислитель:
	     идентификатор
	     идентификатор = константное_выражение

18.3 Операторы

	составной_оператор:
	     { список_описаний opt список_операторов opt }
	список_описаний:
	     описание
	     описание список_описаний
	список_операторов:
	     оператор
	     оператор список_операторов
	оператор:
	     выражение                                               ;
	     if         (         выражение         )         оператор
	     if    (    выражение    )    оператор    else    оператор
	     while        (         выражение        )        оператор
	     do     оператор     while     (     выражение     )     ;
	     for (  выражение opt  ; выражение  opt ;  выражение opt )
	          оператор
	     switch        (        выражение        )        оператор
	     case      константное      выражение      :      оператор
	     default                    :                     оператор
	     break;
	     continue;
	     return            выражение             opt             ;
	     goto                   идентификатор                    ;
	     идентификатор                 :                  оператор
	     delete                    выражение                     ;
	     asm           (            строка           )           ;
	     ;

18.4 Внешние определения

	программа:
	     внешнее_определение
	     внешнее_определение программа
	внешнее_определение:
	     определение_функции
	     описание
	определение_функции:
	     спецификаторы_описания       opt        описатель_функции
	инициализатор_базового_класса opt тело_функции
	описатель_функции:
	     описатель ( список_описаний_параметров)
	тело_функции:
	     составной_оператор
	инициализатор_базового_класса:
	     : ( список_параметров opt )

18.5 Препроцессор

	#define идент строка_символов
	#define идент( идент,...,идент ) строка символов
	#else
	#endif
	#if выражение
	#ifdef идент
	#ifndef идент
	#include "имя_файла"
	#include <имя_файла>
	#line константа "имя_файла"
	#undef идент

19. Отличия от "старого C"

19.1 Расширения

Типы параметров функции могут быть заданы (#8.4) и будут проверяться (#7.1). Могут выполняться преобразования типов.

Для выражений с числами с плавающей точкой может использоваться плавающая арифметика одинарной точности; #6.2.

Имена функций могут быть перегружены; #8.6

Операции могут быть перегружены; #7.16, #8.5.10.

Может осуществляться inline-подстановка функций; #8.1.

Объекты данных могут быть константными (const); #8.3.

Могут быть описаны объекты ссылочного типа; #8.3, #8.6.3

Операции new и delete обеспечивают свободное хранение в памяти; #17.

Класс может обеспечивать скрытые данные (#8.5.8), гарантированную инициализацию (#8.6.2), определяемые пользователем преобразования (#8.5.6), и динамическое задание типов через использование виртуальных функций (#8.5.4).

Имя класса является именем типа; #8.5.

Любой указатель может присваиваться [указателю] void* без приведения типов; #7.14.

Назад | Содержание

Comments: info@citmgu.ru
Designed by Andrey Novikov
Copyright © CIT