
2 семестр ФИБС / Информатика / Lecture_3
.pdf6. ПОДСТАВЛЯЕМЫЕ ИЛИ INLINE ФУНКЦИИ.
Причина введения таких функций состоит в повышении эффективности работы программы. “Стоимость” вызова коротких, часто встречающихся функций ”высока”, так как необходимо затратить память под переменные, передачу параметров в стэк и т.д. Такие функции объявляют подставляемыми.
inline intif (void)
{…}
Для такой функции компилятор сгенерирует код в месте её вызова. При использовании подставляемых функций возрастает скорость выполнения программ, но увеличивает программный код и время на компиляцию.
Пример.
#include <iostream.h> class cl
{
int i;
public: intget_i (void); intput_i (int j);
};
inline int cl :: get_i (void) { return i; }
inline void cl :: put_i (int j) {i=j;}
main (void)
{
cl s;
s.put_i (10); cout<<s.get_i ();
}
Ситуации, препятствующие inline кода:
–наличие оператора switch, goto, операторов цикла, в случае, если функция возвращает более одного значения.
–inline–функции не могут быть рекурсивными (вызывать сами себя) и содержать статические переменные.
–inline–функции могут быть членами класса, могут быть обычными функциями.
Любая функция, определённая внутри шаблона класса, автоматически делается inline–функцией.
Пример.
#include <iostream.h> class cl
{
int i; public:
int get_i (void) { return i; }
intput_i (int j) {i=j; return i;}
};
7. ДИНАМИЧЕСКОЕ ВЫДЕЛЕНИЕ ПАМЯТИ. ОПЕРАТОРЫ NEW,
DELETE.
Синтаксис. pointer_var=new type_var; delete pointer_var;
где pointer_var – указатель на переменную type_var.
Операторnew выделяет соответствующее место для переменной в соответствующей области памяти и возвращает адрес выделенного места, в случае успеха и NULL, если ошибка. Оператор new сам определяет размер типа type_var и возвращает указатель, преобразованный к этому типу.
Выделение памяти под массив: pointer_var=new type_var [SIZE] delete [SIZE] pointer_var;
SIZE можно опустить, компилятор знает объем выделенной памяти. Пример:
main (void)
{
int *p; p=new int;
if (!p){
cout<<”Памяти не достаточно\n”; return 1;
}
….
*p=20;
cout<<p; delete p; return 0;
}
Динамически можно выделить память под объект любого определённого к этому моменту типа. Динамическое выделение памяти под одиночные переменные не выгодно, так как расходуется память и под саму информацию о её выделении. Целесообразно динамически выделять память под массивы больших размеров или под массивы, размерность которых определяется в процессе выполнения программы. Это обычно делается в конструкторе класса.
Пример:
#include <iostream.h> main (void)
{
int *p;
unsigned int size;
cout <<"Введите длину массива ;" cin >> size;
p=new int [SIZE]; if (! p){
cout<< “Недостаточно памяти;” return 1;
}
for (int i=0; i<size; i++){ p[i] _i *i; cout<<p[i];
}
delete p;
}
8. ПЕРЕГРУЖЕННЫЕ ФУНКЦИИ OVERLOADING.
Возможность создания перегруженных функций в С++ является одним из способов реализации полиморфизма. Две или более функций могут иметь одно и тоже имя и отличаться количеством или типом параметров. Обычно перегруженные функции используются для реализации похожих действий над данными разного типа.
В Си есть стандартные функции преобразования строки в число типа int, float, long (atoi, atof, atoll). В С++ есть аналог этих функций, перегруженная функция atonum для всех типов числовых данных.
Пример:
#include <iostream.h> int sqr_it (int i);
float sqr_it (float d); long sqr_it (long l); main ()
{
int i=7; float d=1,5; long l=36000; cout<<sqrt_it (i); cout<<sqrt_it (d); cout<<sqrt_it (l); unsigned int u=4; cout<<sqrt_it (u);
}
int sqrt_it (int i) { return i*i; }
float sqrt_it (float d)
{return d*d; } long sqrt_it (long l)
{return l*l; }
Перегруженные функции не могут отличаться только типом возвращаемого значения.
int sqrt_it (long i); long sqrt_it (long i); sqrt_it (67000);
При обращении перед компилятором встаёт неразрешимая проблема, какую из перегруженных функций выбрать.
8.1 Перегрузка конструктора
Перегрузка конструктора класса осуществляется просто объявлением конструкторов с различным набором параметров.
Пример. class date{
int month, day, year;
public: date (int, int, int); date (char *);
date (int); date (void);
…
};
date begin; date today (23);
date my_day (05,06,2000); date xmas (“02 января”);
В зависимости от того, какие параметры заданы выбирается соответствующий конструктор.