русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Шаблоны функций

Многие алгоритмы не зависят от типов данных, с которыми они работают (классический

пример — сортировка). Естественно желание параметризовать алгоритм таким образом, чтобы его можно было использовать для различных типов данных. Первое, что может прийти в голову — передать информацию о типе в качестве параметра (например, одним параметром в функцию передается указатель на данные, а другим — длина элемента данных в байтах). Использование дополнительного параметра означает генерацию дополнительного кода, что снижает эффективность программы, особенно при рекурсивных вызовах и вызовах во внутренних циклах; кроме того, отсутствует возможность контроля типов. Другим решением будет написание для работы с различными типами данных нескольких перегруженных функций, но в таком случае в программе будет несколько одинаковых по логике функций, и для каждого нового типа придется вводить новую.

В C++ есть мощное средство параметризации — шаблоны. Существуют шаблоны функций и шаблоны классов (о шаблонах классов позже). С помощью шаблона функции можно определить алгоритм, который будет применяться к данным различных типов, а конкретный тип данных передается функции в виде параметра на этапе компиляции. Компилятор автоматически генерирует правильный код, соответствующий переданному типу. Таким образом, создается функция, которая автоматически перегружает сама себя и при этом не содержит накладных расходов, связанных с параметризацией.

Формат простейшей функции-шаблона:

template <class Туре> заголовок{

/* тело функции */

}

Вместо слова Туре может использоваться произвольное имя. В общем случае шаблон функции может содержать несколько параметров, каждый из которых может быть не только типом, но и просто переменной, например:

template <class А, class В, int i > void f(){ ... }

Например, функция, сортирующая методом выбора (он был рассмотрен ранее) массив из п элементов любого типа, в виде шаблона может выглядеть так:

template <class Туре>

void sort_vybor(Type *b, int n){

Type a; //буферная переменная для обмена элементов

for (int i = 0; i<n-l; i++){

int imin = i;

for (int j = i + 1; j<n; j++)

i f (b[j] < b[imin]) imin = j ;

а = b[i]; b[i] = b[imin]; b[imin] = а;

}

}

Главная функция программы, вызывающей эту функцию-шаблон, может иметь вид:

#include <iostream.h>

template <class Туре> void sort_vybor(Type *b, int n):

int main(){

const int n = 20;

int i, b[n];

for (i = 0; i<n; i++) cin>> b [ i ];

sort_vybor(b, n): // Сортировка целочисленного массива

for (i = 0; i<n; i++) cout << b[i] << ' ';

cout << endl;

double a[] = {0.22, 117, -0.08, 0.21, 42.5};

sort_vybor(a, 5); // Сортировка массива вещественных чисел

for (i = 0; i<5; i++) cout << а[1] << ' ';

return 0;

}

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

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

Пример явного задания аргументов шаблона при вызове:

tempiate<class X, class Y, class Z> void f(Y. Z);

void g(){

f<int, char*, double> ("Vas1a", 3.0);

f<int, char*> ("Vas1a", 3.0); // Z определяется как double

f<int>("Vas1a", 3.0); // Y определяется как char*, a Z - как double

// f("Vasia", 3.0); ошибка: X определить невозможно

}

Функция main()

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

// без параметров:

тип main(){ /* ... */ }

// с двумя параметрами:

тип main(int argc, char* argv[]){ /* ... */ }

При запуске программы параметры разделяются пробелами. Имена параметров в программе могут быть любыми, но принято использовать argc и argv. Первый параметр (argc) определяет количество параметров, передаваемых функции, включая имя самой программы, второй параметр (argv) является указателем на массив указателей типа char*. Каждый элемент массива содержит указатель на

отдельный параметр командной строки, хранящийся в виде С-строки, оканчивающейся нуль-символом. Первый элемент массива (argv[0]) ссылается на полное имя запускаемого на выполнение файла, следующий (argv[l]) указывает на первый параметр, argv[2] — на второй параметр, и так далее. Параметр argv[argc] должен быть равен 0.

Если функция main() ничего не возвращает, вызвавшая система получит значение, означающее успешное завершение. Ненулевое значение означает аварийное завершение. Оператор возврата из main() можно опускать

#include <iostream.h>

void main(int argc, char* argv[]){

for (int i = 0; i<argc; i++) cout << argv[i] << ' \ n ':

}

Пусть исполняемый файл программы имеет имя main.exe и вызывается из командной строки:

d:\cpp\main.exe one two three

На экран будет выведено:

D:\CPP\MAIN.EXE

one

two

three

Просмотров: 552


Вернуться в оглавление



Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.