Подставляемые (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 определяет для функции так называемое внутреннее связывание, которое заключается в том, что компилятор вместо вызова функции подставляет команды ее кода. При этом может увеличиваться размер программы, но исключаются затраты на передачу управления к вызываемой функции и возврата из нее. Подставляемые функции используют, если тело функции состоит из нескольких операторов.
Подставляемыми не могут быть:
- рекурсивные функции;
- функции, у которых вызов размещается до ее определения;
- функции, которые вызываются более одного раза в выражении;
- функции, содержащие циклы, переключатели и операторы переходов;
- функции, которые имеют слишком большой размер, чтобы сделать подстановку.