Programowanie proceduralne
Ćwiczenie 5
Przeładowanie nazwy funkcji
Łukasz Sztangret
Katedra Informatyki Stosowanej i Modelowania
Przeładownie nazwy funkcji polega na
tym, że w danym zakresie ważności
jest więcej niż jedna funkcja o takiej
samej nazwie. To, która z nich zostaje
w danym przypadku uaktywniona,
w danym przypadku uaktywniona,
zależy od liczby i typu argumentów
wywołania jej.
1
1
Grębosz J., „Symfonia C++ standard”
Różne typy argumentów
#include<iostream>
using namespace std;
void napis(int a){cout<<"int\n";}
void napis(double a){cout<<"double\n";}
void napis(char a){cout<<"char\n";}
void napis(char a){cout<<"char\n";}
int main()
{
napis(1);
napis(1.5);
napis('a');
napis(int (1.5));
system("pause");
return 0;
}
Różna liczba argunemtów
#include<iostream>
using namespace std;
void napis(int a){cout<<"1 x int\n";}
void napis(int a,int b){cout<<"2 x int\n";}
void napis(int a,int b,int c){cout<<"3 x int\n";}
void napis(int a,int b,int c){cout<<"3 x int\n";}
int main()
{
napis(1);
napis(1,2);
napis(1,2,3);
system("pause");
return 0;
}
Różne typy funkcji – BŁĄD
#include<iostream>
using namespace std;
int zwroc(double a){return int(a);}
double zwroc(double a){return a;}
int main()
int main()
{
int a=zwroc(1.5);
double b=zwroc(1.5);
system("pause");
return 0;
}
Różna kolejność argumentów
#include<iostream>
using namespace std;
void napis(int a, double b){cout<<"int, double\n";}
void napis(double b, int a){cout<<"double, int\n";}
int main()
int main()
{
napis(1,1.5);
napis(1.5,1);
system("pause");
return 0;
}
Argumenty domniemane – BŁĄD
#include<iostream>
using namespace std;
void napis(int a){cout<<"int\n";}
void napis(int a, double b=0){cout<<"int, double\n";}
int main()
{
{
napis(1);
napis(1,1.5);
system("pause");
return 0;
}
typedef – BŁĄD
#include<iostream>
using namespace std;
typedef int calkowity;
void napis(int a){cout<<"int\n";}
void napis(int a){cout<<"int\n";}
void napis(calkowity a){cout<<"calkowity\n";}
int main()
{
int a=1;
calkowity b=1;
napis(a);
napis(b);
system("pause");
return 0;
}
enum
#include<iostream>
using namespace std;
enum litera {a=1,b,c,d};
void napis(int a){cout<<"int\n";}
void napis(int a){cout<<"int\n";}
void napis(litera l){cout<<"litera\n";}
int main()
{
litera l=a;
int i=1;
napis(l);
napis(i);
system("pause");
return 0;
}
Tablica i wskaźnik – BŁĄD
#include<iostream>
using namespace std;
void napis(int a[]){cout<<"tablica\n";}
void napis(int *a){cout<<"wkaznik\n";}
void napis(int *a){cout<<"wkaznik\n";}
int main()
{
int tab[]={1,2,3};
napis(tab);
system("pause");
return 0;
}
Tablice wielowymiarowe
#include<iostream>
using namespace std;
void napis(int a[2][3]){cout<<"tablica 2x3\n";}
void napis(int a[3][4]){cout<<"tablica 3x4\n";}
int main()
int main()
{
int tab1[2][3]={1,2,3,4,5,6};
int tab2[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
napis(tab1);
napis(tab2);
system("pause");
return 0;
}
Tablice wielowymiarowe – BŁĄD
#include<iostream>
using namespace std;
void napis(int a[2][3]){cout<<"tablica 2x3\n";}
void napis(int a[3][3]){cout<<"tablica 3x3\n";}
int main()
int main()
{
int tab1[2][3]={1,2,3,4,5,6};
int tab2[3][3]={1,2,3,4,5,6,7,8,9};
napis(tab1);
napis(tab2);
system("pause");
return 0;
}
Referencja – BŁĄD
#include<iostream>
using namespace std;
void napis(int a){cout<<"wartosc\n";}
void napis(int &a){cout<<"referencja\n";}
int main()
int main()
{
int a=1;
napis(a);
system("pause");
return 0;
}
Typy: T, const T, volatile T – BŁĄD
#include<iostream>
using namespace std;
void napis(int a){cout<<"int\n";}
void napis(const int a){cout<<"const int\n";}
void napis(volatile int a){cout<<"volatile int\n";}
void napis(volatile int a){cout<<"volatile int\n";}
int main()
{
int a=1;
napis(a);
system("pause");
return 0;
}
Typy: T*, const T*, volatile T*
#include<iostream>
using namespace std;
void napis(int *a){cout<<"int*\n";}
void napis(const int *a){cout<<"const int*\n";}
void napis(volatile int *a){cout<<"volatile int*\n";}
int main()
int main()
{
int a=1;
const int b=2;
volatile int c=3;
napis(&a);
napis(&b);
napis(&c);
system("pause");
return 0;
}
Typy: T&, const T&, volatile T&
#include<iostream>
using namespace std;
void napis(int &a){cout<<"int&\n";}
void napis(const int &a){cout<<"const int&\n";}
void napis(volatile int &a){cout<<"volatile int&\n";}
int main()
{
{
int a=1;
const int b=2;
volatile int c=3;
napis(a);
napis(b);
napis(c);
napis(1);
system("pause");
return 0;
}
Wskaźnik do przeładowanej funkcji
#include<iostream>
using namespace std;
void napis(int a){cout<<"int\n";}
void napis(double a){cout<<"double\n";}
void napis(char a){cout<<"char\n";}
int main()
{
{
void (*wsk1)(int)=napis;
void (*wsk2)(double)=napis;
void (*wsk3)(char)=napis;
wsk1(1);
wsk2(1.5);
wsk3('a');
system("pause");
return 0;
}
Wskaźnik do przeładowanej funkcji
#include<iostream>
using namespace std;
void napis(int a){cout<<"int\n";}
void napis(void (*wsk)(int))
{cout<<"void (*wsk)(int)\n";wsk(1);}
{cout<<"void (*wsk)(int)\n";wsk(1);}
int main()
{
napis(napis);
system("pause");
return 0;
}
Wskaźnik do przeładowanej funkcji
#include<iostream>
using namespace std;
void napis(int a){cout<<"int\n";}
void napis(double a){cout<<"double\n";}
void wywolaj1(void (*wsk)(int))
{cout<<"void (*wsk)(int)\n";funkcja(1);}
{cout<<"void (*wsk)(int)\n";funkcja(1);}
void wywolaj2(void (*wsk)(double))
{cout<<"void (*wsk)(double)\n";funkcja(1.5);}
int main()
{
wywolaj1(napis);
wywolaj2(napis);
system("pause");
return 0;
}
Wskaźnik do przeładowanej funkcji
#include<iostream>
using namespace std;
void napis(int a){cout<<"int\n";}
void napis(double a){cout<<"double\n";}
void (*zwroc(void))(int)
void (*zwroc(void))(int)
{return napis;}
int main()
{
void (*wsk)(int)=zwroc();
wsk(1);
system("pause");
return 0;
}