Kamis, 24 September 2009

bahasa pemrograman 2 oop

FUNCTION NAME OVERLOADING
Yang dimaksud dengan function name overloading adalah penggunaan nama
yang sama untuk beberapa fungsi yang menyatakan suatu operasi pada tipe-tipe argumen
yang berbeda-beda. Secara abstrak operasi-operasi itu sebaiknya sama di antara fungsifungsi
tersebut. Sebagai contoh, operator + dalam operasi aritmatika yang sudah tersedia
sebagai bagian dari sistem. Pemakai dapat mendefinisikan fungsi yang di-overload
menurut keperluannya, misalnya:
3 + 4 ;
3.2 + 5.6 ;
Kata (nama) yang di-overload harus ditentukan maksudnya berdasarkan konteks. Tanpa
konteks, kata/nama yang di-overloaded itu akan ambigous (berarti banyak).
Dua atau lebih fungsi dapat diberi nama yang sama asalkan masing-masing fungsi
mempunyai signature yang unik. Signature dibutuhkan oleh jumlah atau tipe dari
argumen, misalnya:
int max ( int , int ) ;
int max ( const int *, int ) ;
int max ( const list & ) ;
Masing-masing memerlukan implementasi yang berbeda, tetapi sebaiknya operasi umum
yang dilakukan sama, yaitu memberikan nilai maksimum. Dari sudut pandang pemakai,
hanya ada satu operasi, yaitu penentuan nilai maksimum, yaitu misalnya:
int ix = max ( i , j );
int iy = max ( iArray , 1024 );
Kompilator bertugas membedakan berbagai instance itu, bahkan pemakai. Tanpa
overloading, ketiga fungsi maksimum di atas masing-masing harus mempunyai nama
yang unik, misalnya i_max, ia_max, atau lainnya. Kerumitan leksikal inilah yang dapat
diatasi dengan overloading. Apabila suatu nama fungsi dideklarasikan lebih dari satu kali
dalam sebuah program, kompilator akan menginterpretasikan deklarasi-deklarasi yang
kedua dan seterusnya sebagai berikut:
1. Jika return-type dan signature dari kedua fungsi itu tepat sama, yang kedua dianggap
sebagai suatu redeklarasi dari yang pertama, misalnya:
extern void print ( int *ia , int sz ) ;
void print (int *ary , int size ) ; // redeklarasi
2. Jika signature dari kedua fungsi itu tepat sama tetapi mempunyai return-type berbeda,
deklarasi yang kedua dianggap sebagai suatu redeklarasi yang keliru dan merupakan
kesalahan pada waktu kompilasi, misalnya:
unsigned int max ( int * , int sz ) ;
extern int max ( int *ia , int ) ; // error
3. Jika signature dari kedua fungsi itu berbeda, kedua fungsi itu dianggap overloaded,
misalnya:
extern void print ( int * , int ) ;
void print ( double *da, int sz ) ;
Pada suatu function overloaded dipanggil, instance mana yang dipilih ditentukan melalui
proses argument matching, yaitu membandingkan argumen aktual dengan argumen
journal dari tiap instance. Misalnya diberikan empat instance berbeda dari fungsi print():
extern void print ( unsign int ) ;
extern void print (char * ) ;
extern void print (char ) ;
extern void print ( int ) ;
Ada tiga kemungkinan matching dari suatu call, yaitu:
1. Match, suatu instance cocok, misalnya:
unsign int a ;
print (‘a’) ; // cocok dengan print (char) ;
print (“a”) ; // cocok dengan print (char* );
print ( a ) ; // cocok dengan print ( unsign int ) ;
2. No Match, argumen aktual tidak dapat dibuat cocok dengan argumen journal dari
semua instance yang tersedia, misalnya:
int *ip ;
small int si ;
print (ip) ; // error : no match
print (si) ; // error : no match
3. Ambigous Match, dimana argumen aktual dapat “match” lebih dari satu instance,
misalnya:
unsign long ul ;
print (ul) ; // error : dapat match dengan print (int) ;
// print (unsign int ) , print (char ).

POINTER KE FUNGSI
Fungsi tidak dapat disalurkan sebagai argumen , tetapi pointer ke fungsi dapat. Tipe
suatu fungsi ditentukan oleh return-type dan signature dari daftar argumennya. Nama
fungsi bukan bagian dari tipe fungsi. Misalnya:
void (*pf) (int * , int , int ) ;
menyatakan bahwa pf adalah pointer ke fungsi yang memerlukan tiga argumen bertipe
int * , int , int dan mengembalikan nilai bertipe void. Contoh fungsi yang dapat ditunjuk
oleh pf adalah:
void quickSort (int * , int , int) :
49
void heapSort (int * , int , int) ;
void ogah (int * , int , int) ;
Evaluasi dari nama fungsi memberikan pointer ke fungsi itu. Sebagai contoh, tipe dari
hasil evaluasi quickSort adalah: void (*) (int * , int , int). Penggunaan operator address-of
pada nama fungsi juga menghasilkan pointer ke tipe fungsi itu, sehingga quickSort
ekivalen dengan &quickSort.
Pointer ke suatu fungsi dapat di inisialisasi sebagai berikut:
void (*pf) (int *, int , int ) = quickSort ;
void (*pfv2) (int * , int , int) = pfv ;
Perhatikan beberapa contoh berikut:
pfv = quickSort ;
pfv2 = pfv ;
extern void g (char ) ;
extern void g (unsign ) ;
void (*pg) (char ) = g ; // ok : void g (char ).
void (*pg2) (int ) = g ; // error
void (*pg3) (char ) = g ; // error
int (*testFunction [10] ) ( ) ;
#include
extern min (int *, int ) ;
int (*pf) (int *, int ) = min ;
const int iaSize = 5 ;
int ia [iaSize] = {1,1,2,3,5} ;
main ( ) {
count << “call langsung : “ << min (ia , iaSize) << endl ;
count << “call lewat pointer : “ << pf (ia , iaSize) << endl ;
}
min (int *ia , int sz ) {
int minVal = ia [0] ;
for (int i = 1 ; i < sz ; ++i )
if (minVal > ia [0] ) minVal = ia [0] ;
return minVal ;
}
Pointer ke fungsi dapat menjadi argumen dari fungsi, misalnya:
extern void quickSort (int *, int , int ) ;
void sort (int , int , int , void ( *) (int *, int ,int , ) = quickSort ) ;
Aplikasi pointer ke fungsi dapat dilihat pada contoh program sort berikut:
#include
void sort ( int*ia , int bawah , int atas , void (*pf) (int *, int , int ) )
{
assert (ia != 0 ) ;
assert (pf != 0 ) ;
pf ( ia , bawah , atas ) ;
}
typedef void (*pfi3) (int *, int ,int ) ;
void sort ( int * ia , int b , int a , pfi3 , pf ) ;
Pointer ke fungsi dapat menjadi return type di suatu fungsi, misalnya:
int ( *ff (int )) (int * ,int ) ;
yang mendeklarasikan bahwa ff() adalah suatu fungsi yang memerlukan suatu argumen
bertipe int . Return type dari ff ( ) adalah int (*) (int *, int ). Penulisan tersebut dapat
disederhanakan dengan typedef, yaitu:
typedef int (*pfi) ( int*, int ) ;
pfi ff (int ) ;

Tidak ada komentar:

Posting Komentar