Подставляемые (inline) функции

Функции с начальными (умалчиваемыми) значениями параметров

Передача многомерных массивов в функцию

При передаче многомерных массивов в функцию все размерности должны передаваться в качестве параметров. По определению многомерные массивы в Си и СИ++ не существуют. Если мы описываем массив с несколькими индексами, например, массив int mas[3][4], то это означает, что мы описали одномерный массив mas, элементами которого являются указатели на одномерные массивы int[4].

Пример: Транспонирование квадратной матрицы

Если определить заголовок функции:

void transp(int a[][],int n){…..} – то получится, что мы хотим передать в функцию массив с неизвестными размерами. По определению массив должен быть одномерным, и его элементы должны иметь одинаковую длину. При передаче массива ничего не сказано и о размере элементов, поэтому компилятор выдаст ошибку.

Самый простой вариант решения этой проблемы определить функцию следующим образом:

void transp(int a[][4],int n), тогда размер каждой строки будет 4, а размер массива указателей будет вычисляться.

#include<iostream.h>

const int N=4;//глобальная переменная

void transp(int a[][N],int n)

{

int r;

for(int I=0;I<n;I++)

for(int j=0;j<n;j++)

if(I<j)

{

r[a[I][j];a[I][j]=a[j][I];a[j][I]=r;

}

}

void main()

{

int mas[N][N];

for(int I=0;I<N;I++)

for(int j=0;j<Nlj++)

cin>>mas[I][j];

for(I=0;I<N;I++)

{

for(j=0;j<N;j++)

cout<<mas[I][j]

cout<<”\n”;

}

transp(N,mas);

for(I=0;I<N;I++)

{

for(j=0;j<N;j++)

cout<<mas[I][j]

cout<<”\n”;

}

}

В определении функции может содержаться начальное (умалчиваемое) значение параметра. Это значение используется, если при вызове функции соответствующий параметр опущен. Се параметры, описанные справа от такого параметра также должны быть умалчиваемыми.

Пример:

void print(char*name=”Номер дома: ”,int value=1)

{cout<<”\n”<<name<<value;}

Вызовы:

1. print();

Вывод: Номер дома: 1

2. print(“Номер квартиры”,15);

Вывод: Номер квартиры: 15

3. print(,15); - ошибка, т. к. параметры можно пускать только с конца

Поэтому функцию лучше переписать так:

void print(int value=1, char*name=”Номер дома: ”)

{cout<<”\n”<<name<<value;}

Вызовы:

1. print();

Вывод: Номер дома: 1

2. print(15);

Вывод: Номер дома: 15

3. print(6, “Размерность пространства”);

Вывод: Размерность пространства: 6

Некоторые функции в СИ++ можно определить с использованием служебного слова inline. Такая функция называется подставляемой или встраиваемой.

Например:

inline float Line(float x1,float y1,float x2=0, float y2=0)

{return sqrt(pow(x1-x2)+pow(y1-y2,2));}//функция возвращает расстояние от точки с координатами(x1,y1)(по умолчанию центр координат) до точки с координатами (x2,y2).

Обрабатывая каждый вызов подставляемой функции, компилятор пытается подставить в текст программы код операторов ее тела. Спецификатор inline определяет для функции так называемое внутреннее связывание, которое заключается в том, что компилятор вместо вызова функции подставляет команды ее кода. При этом может увеличиваться размер программы, но исключаются затраты на передачу управления к вызываемой функции и возврата из нее. Подставляемые функции используют, если тело функции состоит из нескольких операторов.

Подставляемыми не могут быть:

- рекурсивные функции;

- функции, у которых вызов размещается до ее определения;

- функции, которые вызываются более одного раза в выражении;

- функции, содержащие циклы, переключатели и операторы переходов;

- функции, которые имеют слишком большой размер, чтобы сделать подстановку.