- •5. Препроцессор. Директивы препроцессора.
- •7.Работа с файлами. Текстовый и двоичный режим.
- •10.Перечислимый тип. Структуры. Объединения.
- •13.Спецификаторы класса памяти.
- •14.Пространства имён.
- •16.Понятие класса.
- •17.Функции-члены класса. Указатель this.
- •18.Конструкторы. Деструкторы.
- •19.Преобразования объектов класса.
- •20.Доступ к членам класса.
- •21.Статические члены класса.
- •23.Совместное использование.
- •27.Производные классы.
- •29.Указатели на члены класса.
- •30.Множественное наследование.
- •31.Структура dll-библиотеки.
- •32.Статическое и динамическое подключение dll-библиотек.
- •34.Регистры процессора.
- •36.Арифметические команды в языке ассемблера.
- •37.Команды сравнения и перехода в языке ассемблера.
- •38.Команды работы с битами в языке ассемблера.
- •39.Процедуры в языке ассемблера. Передача параметров в процедуру.
- •40.Процедуры в языке ассемблера. Возврат результата. Локальные данные.
20.Доступ к членам класса.
Управление доступом применяется единообразно к функциям-членам класса и данным-членам класса.
Член класса может быть:
приватным (private) – это значит, что его имя может употребляться лишь внутри функций-членов класса и друзей класса, в котором этот член класса объявлен;
защищённым (protected) – это значит, что его имя может употребляться лишь внутри функций-членов класса, друзей этого класса и производных от него классов;
публичным (public) – это значит, что его имя может употребляться внутри любой функции (а также и вне функций в инициализаторах).
Модификаторы доступа можно использовать несколько раз в одном и том же объявлении класса.
Механизмы управления доступом в C++ обеспечивают защиту от случайного, а не от преднамеренногодоступа. Однако это относится к проблемам дисциплины программирования, а не к проблемам языка.
Члены класса без спецификатора доступа по умолчанию являются приватными. Члены структур иобъединений по умолчанию являются публичными.
21.Статические члены класса.
При объявлении класса данные-члены и функции-члены класса можно объявлять статическими с помощью ключевого слова static. Существует лишь один экземпляр статических данных-членов класса,разделяемый всеми объектами этого класса в программе. Статический член является не частью объектов класса, а отдельным объектом. Статический член класса будет существовать, даже если не создано ни одного объекта класса.
Объявление статических данных-членов внутри определения класса не является его определением. Определение должно быть дано где-нибудь ещё.
Статический член mem класса cl можно обозначать как cl::mem, т.е. независимо от объекта. На него можно также ссылаться при помощи операций доступа к членам класса . и ->. При обращении к статическому члену класса через операцию доступа к членам класса выражение слева от этой операции не вычисляется.
Функция-член класса также может быть статической. Такая функция не получает указатель this и может ссылаться на нестатические члены класса только посредством операций доступа к членам класса (. и ->).
Статическая функция-член класса не может быть виртуальной. Не могут существовать одновременно статическая и нестатическая функция-член класса с одинаковым именем и одинаковым набором параметров.
Статические члены глобального класса имеют внешнее связывание, т.е. могут быть доступны из других файлов программы. Локальные (т.е. объявленные внутри некоторой функции) классы не могут иметь статических членов.
Статические члены класса подчиняются обычным правилам доступа к членам класса.
Константные статические члены класса могут быть инициализированы внутри определения класса.
class BitSet
{ private:
typedef _int64 elem;
static const int cBits = sizeof(elem) * 8;
static const int size = 256 / cBits;
elem set[size];
...
};
23.Совместное использование.
Если в некоторой области действия имеется несколько различных объявлений функций с одним именем, это имя называется совместно используемым. Когда употребляется такое имя, нужная функция выбирается путём сравнения типов фактических параметров с типами формальных параметров.
double abs(double x); int abs(int x);
abs(1); abs(1.0); |
// Вызов int abs(int x) // Вызов double abs(double x) |
Поскольку для всякого типа Т типы Т и Т& допускают совпадающие множества инициализирующих значений, функции с типами параметров, различающимися только в этом отношении, не могут иметь одно имя.
Функции, которые различаются только возвращаемым типом, не могут иметь одно имя.
Различные версии совместно используемой функции-члена класса могут предоставлять различныеправа доступа.
class Buffer { private: char *p; int size; protected: Buffer(int s, char *np) { size = s; p = np; } public: Buffer(int s) { p = new char[size = s]; } ... }; |
Процесс поиска подходящей функции из множества перегруженных заключается в нахождении наилучшего соответствия типов формальных и фактических аргументов. Это осуществляется путем проверки набора критериев в следующем порядке:
точное соответствие типов, т.е. полное соответствие или соответствие, достигаемое тривиальными преобразованиями типов (например, имя массива и указатель, имя функции и указатель на функцию, типы T и const T);
соответствие, достигаемое «продвижением» интегральных типов (например, bool в int, char в int, short вint) и float в double;
соответствие, достигаемое путем стандартных преобразований (например, int в double, double в int, doubleв long double, указателей на производные типы в указатели на базовые, указателей на произвольные типы в void*, int в unsigned int);
соответствие, достигаемое при помощи преобразований, определяемых пользователем;
соответствие за счет многоточий в объявлении функции.
Если соответствие может быть получено двумя способами на одном и том же уровне критериев, вызов считается неоднозначным и отвергается.
Результат перегрузки не зависит от порядка объявления функций.
Альтернативой перегрузке является использование нескольких функций с различными именами и разными типами аргументов. При этом приходится помнить несколько имен и то, как их правильно использовать. Кроме того, при отсутствии перегрузки к аргументам функций применяются все стандартные преобразования, что также может привести к дополнительным ошибкам.
Функции, объявленные в различных областях видимости (не пространствах имён), не являются перегруженными.
void f(int);
void g() { void f(double);
|
|
f(1); } |
// Вызов f(double), хотя 1 – целая константа |
