КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Int i,j;for (i=0;i<n;i++) for (j=i;j<n;j++) { X[i][j]=(Y[i][j] + Y[j][i])/2; X[j][i] =X[i][j]; } } void VIVOD(float Y[4][4], int n)//функция вывода матрицы {for (i=0;i<n;i++) {for (j=0;j<n;j++) printf("%8.2f",Y[i][j]); printf("\n"); } } void main() { float A[4][4], B[4][4], C[4][4], D[4][4]; int i, j; printf("Введите матрицу А\n"); for (i=0;i<3;i++) for (j=0;j<3;j++) scanf("%f",&A[i][j]); printf("Введите матрицу B\n"); for (i=0;i<4;i++) for (j=0;j<4;j++) scanf("%f",&B[i][j]); SM(A, 3,C);// обращение к функции SM для матрицы A SM(B, 4, D); //обращение к функции SM для матрицы B printf("Симметричная матрица С\n"); VIVOD(C,3); printf("Симметричная матрица D\n"); VIVOD(D,4); }
Перегрузка функций в С++ Перегруженная функция – это функция, которая позволяет при обращении к себе варьировать типы передаваемых параметров. Цель перегрузки состоит в том, чтобы функция с одним и тем же именем возвращала разного типа значение при обращении к ней с различными типами фактических параметров. Рассмотрим этот механизм на примере некоторой абстрактной функции с именем SUM. Допустим, мы имеем три варианта функции SUM. float SUM (float a, float b); //принимает два вещественных аргумента и возвращает результат ввиде вещественного числа
double SUM (double a, double b); //принимает два аргумента вещественного длинного типа и возвращает результат ввиде вещественного длинного числа
complex SUM (complex a, complex b); //принимает два аргумента комплексного типа и возвращает результат ввиде комплексного числа
Компилятор определит, какую именно функцию с именем SUM надо вызвать по типу передаваемых ей параметров. Наполним функцию SUM банальным алгоритмом вычисления суммы двух чисел. #include "stdafx.h"
#define complex struct compl complex {double x,y;};
complex SUM (complex a, complex b) {complex c; c.x=a.x+b.x; c.y=a.y+b.y; return c; } float SUM (float a, float b) {float c; c=a+b; return c; } double SUM (double a, double b) { double c; c=a+b; return c; }
int _tmain(int argc, _TCHAR* argv[]) {complex z,m,n; float a=4.5,b=6.5; z.x=5; z.y=6; m.x=7;m.y=8; n= SUM (z,m); //вызов функции SUM для комплексных параметров printf("%lf+i%lf\n",n.x,n.y); float d= SUM (a,b); //вызов функции SUM для вещественных параметров printf("d=%f\n",d); float d2= SUM (10,35); //неоднозначный вызов функции SUM printf("d2=%f\n",d2); return 0; }
Использование нескольких функций с одним и тем же именем, но с различными типами параметров, называется перегрузкой функций. По типам фактических параметров компилятор определяет, какую именно функцию требуется вызвать. Этот процесс называется разрешением перегрузки (перевод английского слова resolution в смысле «уточнение»). Тип возвращаемого функцией значения в разрешении не участвует. Механизм разрешения основан на достаточно сложном наборе правил, смысл которых сводится к тому, чтобы использовать функцию с наиболее подходящими аргументами или выдать сообщение, если такой не найдется. Если точного соответствия не найдено, выполняется преобразование типов параметров по общим правилам, например char в int; int во float, float в double; и т.п. Если соответствие может быть получено более чем одним способом, вызов считается неоднозначным и выдается сообщение об ошибке. В нашем примере это продемонстрировано вызовом третьим, когда в функцию SUM передаются в качестве параметров два целых числа 10 и 35. Эти параметры могут быть преобразованы как в тип float, так и в тип double, что и вызовет возникновение ошибочной неоднозначности. При создании перегруженных функций необходимо придерживаться следующих правила: • Перегруженные функции должны находиться в одной области видимости, иначе произойдет сокрытие аналогично тому, как это происходит с одинаковыми именами переменных во вложенных блоках. • Перегруженные функции могут иметь параметры по умолчанию, при этом значения одного и того же параметра в разных функциях должны совпадать. В различных вариантах перегруженных функций может быть различное количество параметров по умолчанию. • Функции не могут быть перегружены, если описание их параметров отличается только модификатором const (например, int и const int ), или использованием ссылки (например, int и int&). Более подробную информацию о перегруженных функциях см. в [2].
|