- •Динамическое распределение памяти Статическое выделение памяти
- •Динамическое выделение памяти
- •Библиотека c для управления динамическим выделением памяти
- •Изменение размеров выделенного блока
- •Агрегатные типы данных
- •Объявление структур
- •Определение и инициализация переменных
- •Инициализация
- •Доступ к полям структуры
- •Функции и структуры
- •Создание синонимов для структурных типов
- •Файловый ввод и вывод
- •Открытие файла
- •Функции для ввода вывода в поток
- •Управление просмотром файлов
- •Функции с переменным числом аргументов
- •Реализация функций с переменным числом аргументов
- •Особенности вызова функции в си
- •Объектно-ориентированное программирование
- •1) Абстрагирование
- •2) Декомпозиция
- •3)Инкапсуляция
- •Наследование
- •Расширение понятия структура
- •Использование ссылок в аргументах функции
- •Функции, возвращающие ссылки
- •Проблема инициализации
- •Объявление и определение классов
- •Конструкторы и деструкторы
- •Варианты синтаксиса инициализации объектов
- •Статические члены-данные
- •Неявный указатель this
- •Статические методы классов
- •Конструктор копирования
- •Друзья класса
- •Область видимости в классе
- •Уточнение концепции ограничения доступа
- •Наследование
- •Конструкторы и деструкторы производных классов
Функции, возвращающие ссылки
Функции могут возвращать ссылки, при этом нужно добавить & в типе возвращаемого значения. Соответственно функция должна возвращать значение являющееся l-value. Нельзя возвращать ссылку на локальную переменную, но можно на статическую.
Проблема инициализации
Обычная практика при описании классов: прятать данные в раздел private, и оставлять доступными методы классов. Однако класс описывает только шаблон, по которому создается его объект. Поэтому, когда создаются объекты, то необходимо выполнить их инициализацию. Например: присвоить значения свойствам объекта. Однако непосредственно обратиться к этим свойствам нельзя. Остается единственная возможность: добавить в класс общедоступный метод, через который можно передавать значения свойствам (методам класса доступно все). Так как проблема инициализации относится ко всем классам, то в СИ++ имеются специальные функции-члены выполняющие инициализацию. Они называются конструкторами.
Объявление и определение классов
Определение класса - это его полное описание, позволяющее компилятору вычислять размер объектов этого класса, а значит создавать переменные этого типа. Однако, если необходимо определить указатель на объект некоторого класса, то компилятору размер объектов не нужен. Ему достаточно знать, что некоторое имя - это имя класса, а это делается с помощью объявления.
Определение класса включает в себя описание всех полей этого класса и определение методов. Возможны разные варианты расположения кода класса. В простых задачах класс может быть определен и использован в одном и том же файле. Недостаток: один и тот же класс может использоваться в разных программах. Поэтому определение класса имеет смысл вынести в отдельный файл и подключать к разным программам при помощи #include.
В профессиональном программировании поступают иначе. В отдельный заголовочный файл помещается описание класса, содержащее определение всех полей и прототипы всех функций. Реализация методов помещается в отдельный файл. Такое разбиение позволяет распространять класс с помощью заголовочного файла и объектного файла с реализацией методов.
Инкапсуляция предполагает, что в большинстве случаев данные должны быть скрыты от прямого доступа. Поэтому работа с ними должна осуществляться с помощью простых функций. Вызов функции приводит к появлению накладных расходов, например: создание фрейма вызова, заполнение его информацией и так далее. Поэтому, чтобы сделать работу программы эффективной компилятор старается вызовы всех функций, определенные внутри фигурных скобок описания класса, заменить кодом, реализующим их тело. То есть вместо вызова функции в исполняемый код будет встроено ее тело. Такие функции называются in-line функции. Однако, если функция выполняет сложные действия (например цикл), то выгода теряется из-за объемов вставляемого кода и компилятор не пытается эти функции сделать in-line.
Class Test {
Int a;
Public:
Void setA(int a0); //прототип
};
Inline Void test::setA(int a0) {a=a0;} // Методы класса, определенные вне его описания должны иметь указание на то, что они относятся именно к этому классу. Для этого используется оператор разрешения области видимости (::). По умолчанию эти методы не являются inline. Мы можем попросить компилятор превратить их в inline, если впереди добавить это служебное слово(inline). Если функция сложная, то компилятор проигнорирует нашу просьбу.