Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
AllCandC++Lectures.docx
Скачиваний:
2
Добавлен:
25.09.2019
Размер:
52.56 Кб
Скачать

Функции, возвращающие ссылки

Функции могут возвращать ссылки, при этом нужно добавить & в типе возвращаемого значения. Соответственно функция должна возвращать значение являющееся 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). Если функция сложная, то компилятор проигнорирует нашу просьбу.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]