Определяет зависящие от реализации указания компилятору (прагмы). Компилятор Visual C++ поддерживает следующие прагмы: alloc text, comment, optimize, auto_inline, component, inline_depth, pack, bss seg, data_seg, function, intrinsic, setlocale, code_seg, hdrstop, message, const seg, once, warning, inline recursion, check_stack, include_alias.
Например, директива
#pragma warning(disable: 4305)
предписывает компилятору не выдавать предупреждения с номером 4305, которое выдается при несовпадении типов данных.
#pragme inline
определяет, что в программе используются ассемблерные вставки.
Препроцессор языка Си представляет собой программу (подпрограмму), которая используется для обработки исходного файла на нулевой фазе компиляции.
Директивы препроцессора представляют инструкции, записанные в исходном тексте программы, облегчающие модификацию исходных программ и делающие их более независимыми от особенностей различных реализаций компилятора языка Си, разных компьютеров и операционных сред.
Макрос – это средство замены одной последовательности символов другой.
Тип данных всегда определяет размер памяти, которая будет выделена под переменную данного типа при ее создании.
При объявлении переменной объектного типа (типа класса) создаются переменные члены класса и вызывается конструктор класса. Производные типы на основе классов позволяют получать доступ к членам класса.
Переменная, объявленная как указатель на класс, применяется для доступа к методам и переменным членам класса. В следующей таблице приведен синтаксис, используемый при работе с указателями на члены класса.
Например:
#include <iostream.h>
class A // Объявление класса A
{ public: int j1;
A(void);
~A(void);};
void main() {
int A::*pToj = &A::j1;
// Объявление производного типа pToj
// как указателя на член класса j1
A jA;
// Объявление переменной объектного типа А A *pjА = & jA;
// Объявление указателя на эту
// переменную (объект)
int j ;
jА.*pToj = 123;
// Присваивание значения переменной
// jA::jl, используя *
j = pjA ->*pToj;
// Получение значения, используя ->*
Std: : cout << j << "\n" ;
}
Указатель на класс может быть преобразован к указателю на базовый класс в двух случаях:
• если базовый класс является доступным и преобразование однозначно;
• если указано явное преобразование типа указателя.
Например:
class А //А - базовый класс
{public:
int а1;
int Fa();
};
class В : public А //В - производный класс
{public:
int b1;
int Fb() ;
};
В bObj; // Объект типа В
A *pA = &bObj;
//Преобразование типа ограничивает
// доступ к членам класса В и
// разрешает доступ только к членам
// базового класса
В *рВ = &bObj;
// Нет преобразования типа и
// следовательно разрешен доступ как
// к членам класса В,
// так и к членам класса А.
рА-> Fa () ;
// Правильно: вызов функции члена класса А. рВ-> Fa () ;
// Правильно: вызов функции,
//наследуемой от класса А
// Вызов рА-> Fb (); ошибочен: функция Fb
// недоступна через указатель на базовый
// класс А
Указатели на члены класса или структуры не могут рассматриваться как обычные указатели и для них не выполняется стандартное преобразование типа.
Квалификация имен
Квалификация имен используется для однозначного понимания указываемого имени. Для квалификации имени могут использоваться следующие операторы: :: (оператор принадлежности); . (оператор доступа к члену класса посредством имени); -> (оператор доступа к члену класса через указатель).