Обычно имя функции выбирается так, чтобы указать ее главное назначение. Удобочитаемые программы имеют обычно разнообразный и грамотный выбор идентификаторов. Иногда для одних и тех же целей используются различные функции.
Термин перегрузка относится к использованию одного и того же имени для обозначения различных значений оператора или функции. Выбор значения зависит от типов аргументов, используемых оператором или функцией. В этой главе мы ограничимся рассмотрением перегрузки функций. Перегрузка операторов обсуждается в главе 7, поскольку используется, главным образом, в контексте классов.
Для примера рассмотрим функцию, которая вычисляет среднее значение в массиве чисел double, в противоположность такой же, вычисляющей среднее значение в массиве целых чисел. Обе функции удобно назвать avg_arr:
double avg_arr(const double a[], int size);
double avg_arr(const int a[], int size) ;
double avg_arr(const int a[], int size)
{int sum = 0;
for(int i=0; i<size; ++i)
sum+=a[i]; //выполняет расчет среднего
//арифметического для целых
return ((double)sum/size);
}
double avg_arr(const double a[], int size)
{double sum=0.0;
for(int i=0; i<size; ++i)
sum+=a[i]; //выполняет расчет среднего
//арифметического для двойной точности
return (sum/size);
}
Следующий код показывает вызов этих функций:
main()
{int w[5]={1, 2, 3, 4, 5};
double x[5]={1.1, 2.2, 3.3, 4.4, 5.5};
cout<<avg_arr(w, 5)<<" int array average\n";
cout<<avg_arr(x, 5)<<" double array average\n";
}
Компилятор выбирает функцию по соответствию типов и аргументов. Правила, по которым это выполняется, называются алгоритмом соответствия сигнатуры. Термин сигнатура относится к списку типов, которые используются в объявлении функции.
Встраивание.
В C++ введено ключевое слово inline, которое ставится перед объявлением функции, если программист хочет заменить вызов функции встраиванием ее кода.
inline double cube(double x)
{return (x * x * x);
}
Компилятор анализирует эту функцию, обеспечивая семантику, эквивалентную не-inline версии. Он же накладывает ограничения на сложность функций, которые могут быть встраиваемыми.
Область видимости.
Базовый язык имеет две принципиальных формы видимости: контекст файла и локальный контекст. Локальный контекст распространяется на блок. Тело функции представляет собой блок, который содержит набор объявлений и параметров. Контекст файла включает внешние или глобальные имена. Правила контекста класса мы будем обсуждать позже.
Основное правило контекста следующее: идентификаторы доступны только внутри блока, в котором они объявлены. Они невидимы за границами этого блока. Вот простой пример:
{int a = 2; //внешний блок
co-ut << a << endl; //выводив 2
{ //вход во внутренний блок
int a = 7; //а ив внутреннего блока
cout << а << endl; //выводит 7
} //выход из внутреннего блока
cout << ++а << endl; //выводит 3
}
Каждый блок имеет собственную спецификацию. Имя из внешнего блока допустимо в том случае, если внутренний блок его не переопределяет. Если же оно переопределено, то имя внешнего блока скрывается или маскируется во внутреннем блоке. Внутренние блоки могут быть вложены на произвольную глубину, определенную ограничениями системы.
Объявления C++ могут быть в любом месте блока, в отличие от ANSI С, где все объявления контекста блока находятся в заголовке блока.
//C++, а не С
int max(int c[], int size)
{cout << "размер массива = " << size << endl;
int comp = с[0]; //объявление comp
for(int i=1; i<size; ++i) //объявление i
if(c[i] > comp) comp = с [i];
return (comp) ;
}
В C++ контекст видимости идентификатора начинается в конце его объявления и продолжается до конца самого внутреннего блока, который охватывает это объявление.
Хотя в C++ и не требуется помещать объявления в заголовок блоков, тем не менее это признак хорошей практики. Часто блоки малы, и, когда они используются вместе с комментариями, обеспечивается хорошо документированный стиль.
Объявления помещаются внутри блоков для того, чтобы позволить вычисленному или введенному значению проинициализировать переменную. Рекомендуется помещать объявления как можно ближе к тому месту, где они используются, особенно в больших блоках.
Похожие записи
No user прокомментировали сообщение
Оставить комментарий