Имена перечислений, структур и объединений
В C++ имя перечисления, структуры или объединения является именем типа. Это упрощает нотацию, поскольку не нужно использовать ключевые слова enum, struct и union перед именем соответствующего типа. Таким образом, в C++ выражения вида
struct Fruits{
// Компоненты структуры
};
Fruits stApple; // Определение переменной типа Fruits .
являются допустимыми.
Блочные объявления
В C++ допускаются объявления внутри блоков и после программных операторов, что позволяет определять (объявлять) объект в том месте программы, где он используется первый раз — во многих случаях это улучшает читабельность программы.
void myFunc()
{
int nFirstVar;
nFirstVar++;
// Другие операторы функции
...
float fSecondVar =7.0;
...
// Остальные операторы функции
}
Кроме того, можно определить и инициализировать переменную непосредственно внутри формального описания управляющей структуры:
for(int iCount = 0; iCount < MAX_COUNT; iCount++) {...}
Оператор scope (::) уточняет область действия идентификатора переменной/функции/т.п.; Его необходимость связана с тем, что каждый применяемый в программе идентификатор должен быть уникален (Программа не может решить сама, какую из трех переменных Х применять) в каждой области видимости – что не всегда удобно при подключении большого кол-ва внешних библиотек. В таком случае создаются пространства имен, которые позволяют группировать идентификаторы, иначе видимые глобально, в группы, объединенные общими именами. Идентификатор, объявленный в пространстве какого-то имени, в нем может применяться без ограничений, но вне этого пространства, чтобы обратиться к нему, нужно воспользоваться оператором scope (::) и обозначить, что вызываемый идентификатор принадлежит к этому пространству имен, например:
namespace first
{ int x = 5; }
Int main () {
int y = first::x;//Правильно, программа видит переменную х, принадлежащую first
x= y-1;//Неправильно, программа не видит переменную х
}
Описатель const: Может быть добавлен при объявлении & инициализации переменной, значение которой программа не будет изменять. Например: const double pi = 3.141529; Назначение? Удобнее всякий раз, когда нам нужно значение числа π, писать pi, чем многозначное число. Альтернатива – директива препроцессора #define, будет выглядеть как #define pi 3.141529. Разница – при использовании const программа видит pi, читает как имя и обращается к значению, которая лежит по адресу pi; При использовании #define программа видит pi, читает 3.141529 Соответственно, #define быстрее, const надежнее (Если не взлетит – найти ошибку проще)
29.Исходные файлы и выполняемые файлы. Явное преобразование типов. Объявления функций. Перегруженные функции. Значения параметров функций по умолчанию. Функции с неуказанным числом параметров. Ссылочные параметры функции. Операторы new и delete. Указатели voi
Явное преобразование типов: Это преобразование, при котором мы явно выразили желание изменить тип данных. Как и любое преобразование, может привести к потере данных – в данном случае подразумевается, что это учтено разработчиком. Пример:
double a = 3.5;
int (a); //Производится явное преобразование типа переменной а
Объявление функций: В С++ в выражениях могут быть использованы только объявленные идентификаторы, поэтому любая функция должна быть объявлена до её вызова.
При объявлении не обязательно полностью описывать функцию – достаточно необходимой для вызова информации – идентификатора функции, типа возвращаемых ею данных и типов передаваемых функции параметров.
Перегрузка функций: Несколько функций может иметь одинаковый идентификатор (имя), если параметры их вызова различаются в числе и/или типе; Программа при вызове функции под таким именем выберет ту из функций, которой соответствуют переданные аргументы.
Значение параметров функций по умолчанию: При описании параметров функции можно задать опциональный параметр, что позволяет, к примеру, при вызове функции с тремя параметрами задать только два аргумента. Для этого необходимо для последнего параметра задать значение по умолчанию. Например:int divide (int a, int b=2){return a/b;}
Функции с неуказанным числом параметров: Если в функцию может быть передано неопределенное число параметров одного типа (Например, передан массив чисел неопределенной длины), то вместо перегрузки функции с её описанием для каждого возможного числа параметров можно описать функцию с неуказанным числом параметров, например:
int average (int n, ..) {~~~~}
Это позволяет значительно сократить в объеме код программы.
Ссылочные параметры функции: Параметр, передаваемый в функцию, может быть передан двумя путями – может быть передано значение - тогда функция работает с локальной копией параметра, или может быть передана ссылка на значение (= Адрес этого значения), и тогда функция работает непосредственно с оригинальным параметром.
int *a = new int(2); // Оператор new выделит память, 2 — значение, которым эта память будет проинициализирована cout << a; // Выведет адрес в шестнадцатеричном формате, например 0x102AF2 cout << *a; // Выведет значение, которое располагается по адресу 0x102AF2. Т.е., 2 delete a; // Пометит занимаемую область памяти, как освобождённую |
Операторы New & Delete служат для динамического выделения памяти в ходе выполнения программы в С++; При помощи оператора New программа выделяет память и возвращает адрес выделенной памяти, при помощи оператора Delete программа освобождает выделенную память.
В C++ существует специальный тип указателя, который называется указателем на неопределённый тип. Для определения такого указателя вместо имени типа используется ключевое слово void в сочетании с описателем, перед которым располагается символ ptrОперации *.
void *UndefPoint;
30.Исходные файлы и выполняемые файлы. Основные усовершенствования по сравнению с языком С.(часто повторяется). Конструкторы классов и инкапсуляция данных. Класс struct. Конструкторы и деструкторы. Сообщения. "Дружественные" классы.
Конструкторы и деструкторы:
Это функции класса. Конструктор при вызове создает и инициализирует объект класса (Что позволяет избежать обращения к объекту до его инициализации), деструктор при вызове очищает память, выделенную под объект (Сам объект удаляется в последнюю очередь). Конструктор класса имеет имя класса и вызывается подобно функции (Класс идентификатор_объекта = конструктор(аргументы)); Деструктор имеет имя, состоящее из ~ и имени класса. Деструктор необходимо вызывать для объектов, на которые память выделена динамически (delete имя_объекта;), для остальных объектов он вызывается автоматически по завершении выполнения программы; Если деструктор в классе не описан, компилятор его автоматически создаст.
Инкапсуляция:
Для любого поля класса (Переменная, функция, т.д.) можно задать параметры доступа к нему. Возможны 2 варианта – Public (Общедоступен) и Private (Доступен только для объектов этого класса). Инкапсуляция поля есть запрещение доступа к нему извне.
Дружественные классы и функции:
Иногда нам надо дать доступ к инкапсулированным данным какой-то функции или классу извне (Например, чтобы не описывать эту же функцию еще раз.) В таком случае в описании класса мы записываем friend class имя_класса; или friend прототип_функции;, и тогда этот класс или функция получают доступ к инкапсулированным данным.
Класс struct :
Класс, созданный с помощью struct , практически не отличается от обычного класса (Объявленного через class). Единственное функциональное отличие – в объекте вида class по умолчанию любой член может быть вызван только другим членом класса (private), а в объекте вида struct любой член по умолчанию доступен кому угодно (public).
31. Исходные файлы и выполняемые файлы. Перегрузка операций. Производные классы. Полиморфизм при использовании виртуальных функций. Библиотеки потоков. Базовые элементы программы на С. Пять основных компонентов программы.