Функции в C++.

Функции в C++ представляют собой подпрограммы. Большой код удобно разбивать на подпрограммы. Такое разбиение позволяет быстрее искать ошибки, повышает читаемость кода и даёт много преимуществ.

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

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

Пример построения функции:

#include "stdafx.h" 
#include <iostream>     
using namespace std;

void function_name () //создаем функцию
{
    cout << "Hello, world" << endl;
}

int main()
{
    function_name(); // Вызов функции
    return 0;
}

Перед вами простая программа, Hello, world, только реализованная с использованием функции. Если мы хотим вывести «Hello, world» где-то еще, нужно вызвать соответствующую функцию. В данном случае это делается так: function_name(); Оператор return используется для возвращения вычисляемого функцией значения.

Значения по умолчанию

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

тип имя=ЗначениеПоУмолчанию

Пример:

int pow(int n, int k=2)  // по умолчанию k=2
{
  if( k== 2) return( n*n );
  else return( pow( n, k-1 )*n );
}

Вызывать эту функцию можно двумя способами:

t = pow(i);  // t = i*i;
q = pow(i, 5); // q = i*i*i*i*i;

Перегрузка функций

При перегрузке функция с одним именем по-разному выполняется и возвращает разные значения при обращении к ней с разными по типам и количеству фактическими аргументами. Для обеспечения перегрузки функций необходимо для каждого имени определить, сколько разных функций связано с ним, т.е. сколько вариантов сигнатур допустимы при обращении к ним.

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

int sum(int a, int b=1)  { return(a+b); }
int sum(int a)           { return(a+a); }
то вызов
int r = sum(2);  // ошибка
выдаст ошибку из-за неоднозначности толкования sum().

Встраиваемые функции

В базовом языке Си директива препроцессора #define позволяет использовать макроопределения для записи вызова небольших часто используемых конструкций. Некорректная запись макроопределения может приводить к ошибкам, которые очень трудно найти. Макроопределения не позволяют определять локальные переменные и не выполняют проверки и преобразования аргументов. Если вместо макроопределения использовать функцию, то это удлиняет объектный код и увеличивает время выполнения программы.

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

inline double SUMMA(double a, double b)
{
 return(a + b);
}
При вызове этой функции
rez = SUMMA(x,y)*10;
будет получен следующий результат:
rez=(x+y)*10

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

  • Определение и объявление функций должны быть совмещены и располагаться перед первым вызовом встраиваемой функции.
  • Имеет смысл определять inline только очень небольшие функции, поскольку любая inline-функция увеличивает программный код.
  • Различные компиляторы накладывают ограничения на сложность встраиваемых функций. Компилятор сам решает, может ли функция быть встраиваемой. Если функция не может быть встраиваемой, компилятор рассматривает ее как обычную функцию.

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

Шаблоны — средство языка C++, предназначенное для кодирования обобщённых алгоритмов, без привязки к некоторым параметрам (например, к типам данных).

Пример:

template <typename T>
void exchange ( T &a, T &b )  {
  T t;
  t = a;
  a = b;
  b = t;
}

// вызвать функцию можно так:
int a=5, b=8;
exchange (a,b);
cout << a;

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

double p=3.14, e=2.71;
exchange <double> (p,e);

Шаблоны применимы не только к функциям, но и к классам. При этом их использование для классов ничем принципиально не отличается от использования для функции.

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Загрузка...

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Chinese (Traditional)EnglishJapaneseRussianUkrainian

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: