Встраиваемых функций и функций с аргументами по умолчанию
Вызов функции всегда сопровождается дополнительными действиями по обращению к функциям, передачей параметров через стек, передачей возвращаемого значения. Все это ухудшает характеристики программы, в частности ее быстродействие.Но C++ позволяет задавать функции, которые не вызываются, а встраиваются в программу непосредственно в месте ее вызова. В результате этого в программе создается столько копий встраиваемой функции, сколько раз к ней обращалась вызывающая программа.
Использование встраиваемых функций не связано с механизмами вызова и возврата, следовательно, работают они гораздо быстрее обычных. Однако они способны значительно увеличить объем программного кода.Для объявления встраиваемой функции указывают спецификатор inline перед определением функции.
Спецификатор inline является не командой для компилятора, а только запросом. Поэтому, если компилятор по каким-либо причинам не может встроить функцию, она компилируется как обычная и никаких сообщений об этом на экран не выдается.
Некоторые компиляторы не могут сделать функцию встраиваемой, если:функция содержит операторы цикла,функция содержит операторы switch или goto,функция рекурсивная.
Реально компилятор может проигнорировать объявление inline, если сочтет функцию слишком большой, вследствие чего характеристики программы могут оказаться хуже, чем в случае вызываемой функции
24. Понятие и назначение функции в С(C++). Понятие и назначение перегрузки функций вС++
В программах, написанных на языке C++, возможно существование нескольких различных функций, имеющих одно имя. При этом одноименные функции обязательно должны отличаться числом и/или типом своих аргументов. Такие функции называются перегруженными.
Для того чтобы перегрузить функцию, необходимо задать все требуемые варианты ее реализации. Компилятор автоматически выбирает правильный вариант вызова согласно числу и типу аргументов. Тип возвращаемого значения при перегрузке большой роли не играет.
Перегруженные функции позволяют упростить программу, допуская обращение к одному имени для выполнения близких по смыслу (но, возможно, алгоритмически различных) действий.
Возможность существования в одной программе нескольких одноименных функций является одним из проявлений полиморфизма. Поскольку выбор нужного варианта происходит на этапе компиляции программы, то это - статический полиморфизм.
Возможность использования одинаковых идентификаторов для выполнения близких по смыслу, но, возможно, алгоритмически различных действий называется полиморфизмом
Функции не могут быть перегружены, если
-Они отличаются только типом возвращаемого значения. Попытки перегрузить функции таким образом приводят к появлению ошибки компиляции «Typemismatchinredeclaration». Это происходит потому, что компилятор принимает во внимание только аргументы функций.
-Их аргументы отличаются только использованием ссылок.
Их аргументы отличаются только применением модификаторов const
25. Понятие и назначение функции в С(C++). Как определяется указатель на функцию? Когда удобно использовать указатель на функцию
В определении указателя на функцию количество и тип параметров должны совпадать с соответствующими типами в определении функции, на которую ставится указатель.
Присвоение указателю адреса функции не требует операции взятие адреса (&), поскольку имя функции само по себе обозначает этот адрес.
Определение указателя на функцию:
тип (*имя_указателя)(типы параметров функции)
Вызов функции по указателю:
(*имя_указателя)(список аргументов)
#include<conio.h>
#include<iostream>
usingnamespacestd;
//суммированиедвухчисел
float sum(float a, int b)
{ return a + b;
}int main()
{ float (*ptr)(float, int); // описание указателя на функцию
ptr = sum; // присвоение указателю адреса функции
floatx = sum(0.5, 1); // вызов функции по имени
floaty = (*ptr)(1.5, 2); // вызов функции по указателю
cout<< x << ' ' << y; getch();}
26. Понятие файла и потока в С и С++. Назначение потоков. Буферизированный ввод вывод.
Поток позволяет ассоциировать файл с буфером, который позволяет осуществить эффективный ввод - вывод. Буфер – это выделенный участок памяти. При буферном вводе информация с носителя информации (из файла) вначале поступает в буфер, а затем оттуда передается прикладной программе. Аналогично и при буферном выводе – информация из программы вначале поступает в буфер, а затем – на носитель информации (в файл).
Если для ввода и вывода в программе используются потоки, то для программиста буферизация выполняется автоматически.
Синтаксис определения файлового потока для вывода данных в заданный файл :
ofstreamимя_потока(имя_файла,ios::out);
Синтаксис определения файлового потока для ввода данных из заданного файла :
ifstreamимя_потока(имя_файла,ios::in);
Синтаксис определения файлового потока для добавления данных в конец файла :
ofstreamимя_потока(имя_файла,ios::app);
Синтаксис чтения данных из файла:
Файловый_поток>>имена_переменных;
Синтаксис вывода данных в файл:
Файловый_поток<<выводимые_данные;
Понятие текстовых и бинарных файлов. Открытие файлов в стиле языка С: синтаксис,
семантика, примеры
Текстовые файлы состоят из строк символов и предназначены для чтения человеком. На диске текстовые файлы хранятся в виде сплошной последовательности символов, и их деление на строки становится заметным лишь в момент вывода на экран или на печать, так как именно при выводе управляющие символы (например, \n) начинают выполнять свои функции.
Бинарный файл – это последовательность байтов, однозначно соответствующая последовательности байтов, записанной на внешнем устройстве
При открытии файлов порция информации из дискового файла поступает в буфер и указатель на поток получает адрес буфера.
В языке С файлы открываю с помощью функции fopen(). Функция fopen() имеет два параметра. Первый параметра является строковой константой, которая задает имя файла и путь к нему. Второй параметр – тоже строковая константа – задает режим доступа к файлу. Режим доступа описывает две составляющие: способ доступа (чтение или запись) и тип файла (текстовый или двоичный).
Для работы с текстовым файлом можно к режиму доступа добавить строчную латинскую букву t, но делать это не обязательно, так как файлы открываются в текстовом виде по умолчанию.
Для работы с бинарными файлами обязательно нужно к режиму доступа добавить строчную латинскую букву b.
Таким образом, чтобы открыть файл (например, текстовый файл) для чтения, нужно произвести следующие действия :
-Объявить указатель на поток;
-Открыть файл функцией fopen() (т.е. связать указатель на поток с дисковым файлом и указать режим доступа r).
При попытке открыть существующий файл можно допустить ошибку в его имени или в указании пути к нужному файлу. Это вызывает ошибку выполнения программы. Следует предвидеть подобные ситуации и проводить проверку возможности открытия файла. Такую проверку осуществить довольно легко, так как функция fopen() возвращает значение указателя на поток в случае его успешного открытия и значение NULL (нулевой указатель), если доступ к файлу невозможен