wyklad 12 cz1


Funkcje przecia\one mają:
-taką samą nazwę
-są zadeklarowane w tym samym zasięgu
-mają ró\ne list parametrów formalnych
W rodzinie funkcji przecią\onych ka\da lista parametrów formalnych musi
być jednoznaczna ze względu na ich liczbę i ich typy.
void f(int, int);
void f(int, int, int);
void f(double, double);
int f(int, int); // zle takie same argumenty jak w pierwszej funkcji
inline float pow(float x, float y) ;
inline long double pow(long double x, long double y) ;
inline double pow(double x, int n);
inline float pow(float x, int n);
inline long double pow(long double x, int n);
pow(2, 2);
void drukuj(char *s) { cout<void drukuj(double m) { cout<void cokolwiek()
{
void drukuj (int k);
// drukuj("zdanie"); // funkcja drukuj(char *) jest przesłonięta i
// nie jest tu widziana
drukuj(33); // dobrze drukuj dla tego parametru jest dostępna
drukuj(33.33); // zostanie wywołana funkcja drukuj(int k)
}
void drukuj(int k) { cout< Ka\dy argument formalny z kwalifikatorem const ma znaczenie tylko
wewnątrz funkcji i nie jest brany pod uwagę przy identyfikowaniu funkcji.
Deklaracje tej samej funkcji
void f(int);
void f(const int);
Jeśli kwalifikator const dotyczy typu do którego odnosi się wskaznik lub
referencja to wówczas jest brany pod uwagę.
Deklaracje ró\nych funkcji
void f(int *);
void f(const int *);
void f(int &);
void f(const int &);
Zbiór funkcji przecią\onych mo\e być deklarowany wewnątrz przestrzeni nazw.
Ka\da przestrzeń nazw utrzymuje własny zasięg, więc funkcje, które są
składowymi dwóch ró\nych przestrzeni nie mogą się wzajemnie przecią\ać.
namespace IBM {
void drukuj(const string &);
void drukuj(double);
}
namespace BBC{
void drukuj(int); // nie przecią\a funkcji drukuj() z IBM
} // odrębny zasięg
namespace IBM {
void drukuj(const string &);
void drukuj(double);
int maks(int, int);
double maks (double, double);
}
using IBM::maks;
//using IBM::maks(int,int); // zle nie mo\na specyfikować listy argumentów
//formalnych funkcji w deklaracji u\ywania
int main()
{
maks(2, 3);
maks(2.2, 3.3);
}
Deklaracja u\ywania wprowadza funkcję do zasięgu, w przypadku gdy
funkcja o tej nazwie w tym zasięgu istnieje zostaje przecią\ona, gdy zostanie
napotkana funkcja z takimi samymi parametrami sygnalizowany jest błąd.
#include
using namespace std;
namespace IBM {
void drukuj(const char *s){cout<<"lancuch: "<void drukuj(double x){cout<<"double: "<}
using IBM::drukuj;
void drukuj(int a){ cout<<"int: "<int main()
{
drukuj(2);
drukuj(2.2);
drukuj("ala");
return 0;
}
Wskazniki do funkcji przecią\onych
void f(double);
void f(int);
void(*wskf)(int)=&f;
Aby móc wybrać odpowiednią funkcje inicjującą ten wskaznik kompilator
szuka w zbiorze funkcji przecią\onych takiej funkcji, która ma ten sam
typ parametrów i wartości zwracanej co wskaznik. Jeśli nie ma ścisłej
zgodności sygnalizowany jest błąd.
void f(int x)
{
cout<}
f(2);
f(3.3);
f('a'); //wyprowadzony zostanie kod litery a, czyli 97
Rozstrzyganie przecią\enia funkcji
jest to proces, w którym dokonuje się powiązania
wywołania funkcji z funkcją ze zbioru funkcji przecią\onych
Rozstrzyganie przecią\enia funkcji przebiega w trzech etapach.
1) Zidentyfikowanie zbioru funkcji przecią\onych, który mo\na rozwa\ać dla danego
wywołania oraz zidentyfikowanie listy parametrów aktualnych w wywołaniu funkcji.
2) Wybieranie funkcji ze zbioru funkcji przecią\onych, tych, które ze względu na
liczbę i typy parametrów formalnych, mo\na by wywołać z parametrami aktualnymi.
3) Wybieranie funkcji, która jest ściśle zgodna z wywołaniem funkcji.
Etap 1:
" wybór funkcji kandydujących
- są to funkcje, które mają taką samą nazwę, jak funkcja wywoływana i której
deklaracja jest jest widoczna w punkcie wywołania
" rozpoznanie parametru aktualnego funkcji
void f( );
void f( int );
void f( double, double=3.4);
void f( char*, char*);
void g(int);
int main( )
{
..............
f(5.6);
..............
}
Etap 2:
" wybranie ze zbioru funkcji kandydujących, funkcji które mogą być wywołane z
argumentami określonymi w wywołaniu funkcji.
void f( int );
void f( double, double=3.4);
Je\eli w drugim etapie nie zostanie znaleziona \adna funkcja \ywotna, wtedy
sygnalizowany jest błąd.
Lista parametrów formalnych funkcji \ywotnej ma tyle samo argumentów ile występuje
w wywołaniu lub więcej je\eli u\yte są parametry domyślne.
Etap 3:
" wybranie spośród funkcji \ywotnych takiej funkcji, która najlepiej odpowiada
danemu wywołaniu funkcji
void f( double, double=3.4);
Funkcją naj\ywotniejszą jest taka funkcja dla której spełniane są warunki:
" przekształcenia typów zastosowane do argumentów są ni\
przekształcenia niezbędne do tego, aby mo\na było wywołać dowolną inną
funkcję \ywotną
" przekształcenia typów zastosowane do pewnych argumentów ni\
przekształcenia, które trzeba by było zastosować do tych samych argumentów
przy wywołaniu pozostałych funkcji \ywotnych
Dopasowania
" dopasowanie dosłowne,
" dopasowanie dosłowne z konwersją trywialną,
" dopasowanie z awansem,
" dopasowanie z u\yciem konwersji standardowych.
Dopasowanie dosłowne
Typ wywołania funkcji jest taki sam jak typ parametru formalnego
deklarowanej funkcji.
int f(int);
int f(double);
int a=f(3);
Dopasowanie dosłowne z konwersją trywialną
Przekształcenie typu T w typ T&:
T  T&
int f(int &a);
int b, c;
c=f(b);
Przekształcenie typu T& w typ T
T&  T
int f(int a);
int b, &c=b, d;
d=f(c);
Przekształcenie tablicy we wskaznik
T[ ]  T*
int f(int *);
int array[10];
f(array);
Dodanie kwalifikatora const do typu
T  const T
int f(const int );
int b, a=3;
b=f(a);
Dodanie kwalifikatora const do typu na który pokazuje wskaznik.
T*  const T*
bool f(const int *p1, const int *p2);
int t[3], p[3];
bool k=f(t, p);
void f(int x) {cout<void f(char x) {cout<void f(short x){cout<...................
unsigned char znak='a';
f(znak);
unsigned short s=1;
f(s);
enum STAN {Sukces, Porazka};
......................
f(Sukces);
Dopasowanie z awansem
unsigned char
char
short
int
bool
Je\eli sizeof(short)unsigned short int
w przeciwnym razie
unsigned short unsigned int
Typ float awansuje do typu double
double
float
int, unsigned int, long, unsigned long
wyliczenie
Dopasowanie z u\yciem konwersji standardowych
a) przekształcenia typów całkowitych lub typu wyliczeniowego w inny typ
całkowity z wyłączeniem przekształceń będących awansowaniem,
int short
int unsigned int
b) przekształcenia dowolnego typu zmiennoprzecinkowego w dowolny inny
typ zmiennoprzecinkowy z wyjątkiem awansowań,
double float
long double double
c) przekształcenia między typami całkowitymi, a zmiennoprzecinkowymi,
int double
double int
d) przekształcenia wartości całkowitej 0 w typ wskaznikowy NULL,
przekształcenia dowolnego wskaznika w typ void *,
int * void *
e) przekształcenia dowolnego typu całkowitego, wyliczeniowego w typ bool
int bool
Uwaga!
Wszystkie przekształcenia standardowe są traktowane równorzędnie.
void f(unsigned int);
void f(float);
int main( )
{
f('a');
f(0);
f(2ul);
f(3.1415);
f(true);
}


Wyszukiwarka

Podobne podstrony:
GW Wyklad cz1
EPS materialy wyklad cz1
diagnoza wyklad cz1
GW Wyklad06 cz1
GW Wyklad03 cz1
GW Wyklad13 cz1
Miernictwo Komentarz do wykładów cz1
podstawy relacyjnych?z?nych wyklad cz1 architektura
Wykład cz1 uzupełnienie
Wykład 5 cz1 antastic pl
wyklad 4 nazwy cz1
GW Wyklad Budownictwo cz1
2012 AMI wyklad print cz1
Chemia, TCh, OSr, IM wyklad AM cz1
Wykład 4 (TPD cz1)
wyklad krz cz1
WYKŁAD St Opi cz1
WSB wykład5 wykład6 Inżynieria systemów SSP2012 CZ1 CZ4

więcej podobnych podstron