Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
0
Добавлен:
31.05.2025
Размер:
329.04 Кб
Скачать

6. ПОДСТАВЛЯЕМЫЕ ИЛИ 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 января”);

В зависимости от того, какие параметры заданы выбирается соответствующий конструктор.

Соседние файлы в папке Информатика