Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы, часть 2.doc
Скачиваний:
2
Добавлен:
01.05.2025
Размер:
80.41 Mб
Скачать

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

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

Пример:

void printarr(int* const a, const int& n) {

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

}

void printarr(char* const a) {

cout << a;

}

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

Перегрузка функций удобна для выполнения аналогичных действий для значений разных типов:

double frac(int a, int b) {

return (double)a/b;

}

double frac(double a, double b) {

return a/b;

}

...

cout << frac(7,3) << endl; // работает первая функция

cout << frac(7.5,2.5) << endl; // работает вторая функция

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

А вот такой вызов вызовет ошибку компиляции:

cout << frac(3.14,2) << endl;

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

Если мы дополнительно определим функцию с параметром по умолчанию, как перегруженную, то также требуется следить за однозначностью при вызове.

Пример:

double frac(int a, int b, double c = 3.14) {

return (double)(a/b)*c;

}

Данная функция хоть и является очередной перегрузкой функции frac не может быть использована, потому что в случае вызова frac(4,3) — не понятно, какой вариант использовать: первый или третий.

Следующая программа на языке C++ также содержит пример передачи массива в функцию. //  // arrayarg.cpp  // Эта программа на языке C++ демонстрирует передачу массива в качестве  // аргумента функции.  // #include ‹iostream.h› #define  iSIZE 5 void vadd_l (int iarray[]);  main() { int iarray[iSIZE] = {0,1, 2, 3, 4 } ;  int i;  cout << "Массив iarray перед вызовом функции vadd_l:\n\n"; for(i = 0; i < iSIZE;  i++) cout << " " << iarray[i];  vadd_l(iarray);  cout << "\n\nМассив iarray после вызова функции vadd_l:\n\n"; for(i =0;  i < iSIZE;  i++) cout << " " << iarray[i];  return(0);  }  void vadd_l(int iarray[]) { int i;  for(i =0;i < iSIZE; i++)  iarray [i]++;  }  В процессе выполнения программы на экран будет выведена следующая информация: Массив iarray перед вызовом функции vadd_l: 0 1 2 3 4 Массив iarray после вызова функции  vadd_l: 1 2 3 4 5  Результаты работы программы дают четкий ответ на вопрос о том, каким способом массив передается в функцию: по значению или по ссылке.   Функция vadd_l() добавляет единицу к каждому элементу массива. Так как это действие отражается на массиве iarray в функции main(), можно сделать вывод, что аргумент передается по ссылке. 

41,42

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

К полям внутри класса можно обращаться непосредственно по именам полей.

Методы класса — это функции, которые смогут применяться к экземплярам класса. Грубо говоря, метод — это функция объявленная внутри класса и предназначенная для работы с его объектами.

Методы объявляются в теле класса. Описываться могут там же, но могут и за пределами класса (внутри класса в таком случае достаточно представить прототип метода, а за пределами класса определять метод поставив перед его именем — имя класса и оператор ::).

Методы и поля входящие в состав класса называются членами класса. При этом методы часто называют функциями-членами класса.

Пример:

class Complex {

double img;

double real;

};

В примере описан класс Complex с двумя полями img и real.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]