• Tidak ada hasil yang ditemukan

Template Fungsi

Dalam dokumen BAB 14 OPERATOR OVERLOADING (Halaman 36-40)

TYPECASTING DAN RTTI

18.2 Template Fungsi

Seperti telah disinggung sebelumnya bahwa dengan adanya template, kita dapat membuat fungsi-fungsi generik. Adapun yang dinamakan fungsi generik di sini adalah fungsi yang mempunyai parameter bertipe generik. Artinya, pada saat pemanggilan fungsi tersebut, tipe dari parameter aktual yang dimasukkan dapat bersifat dinamis (berubah-ubah). Dengan kata lain, fungsi generik juga dapat diartikan sebagai fungsi yang mampu melakukan overload terhadap dirinya sendiri.

Dengan demikian, jika kita membuat satu fungsi generik, maka fungsi tersebut dapat dipanggil dengan tipe parameter yang berbeda.

18.2.1 Mendefinisikan Template Fungsi

Sebenarnya cara yang digunakan untuk mendefinisikan suatu template fungsi adalah sama seperti pada saat kita membuat fungsi biasa, perbedaannya hanya terletak pada jenis parameternya. Di sini, kita harus mendefinisikan parameter tersebut dengan tipe generik.

Adapun bentuk umum dari pembuatan fungsi generik (template fungsi) adalah seperti yang terlihat di bawah ini.

template <class T>

tipe__data nama__fungsi (parameter!, parameter^, . . . } { Statemen yang_akan_dilakukan;

Kata kunci template di atas berfungsi untuk menunjukkan bahwa fungsi tersebut merupakan fungsi generik. Sedangkan T yang tertulis dalam <class T> disebut dengan tipe generik, yang kemudian akan digunakan dalam pendeklarasian parameter dari

Pemrograman

fungsi tersebut. Kita dapat membuat nama tipe ini sesuai dengan nama yang kita inginkan.

Untuk lebih memahaminya, di sini kita akan membuat sebuah contoh program yang di dalamnya terdapat pembuatan fungsi generik. Contoh fungsi yang akan kita ambil di sini adalah fungsi untuk menukarkan nilai dari dua buah variabel. Adapun sintaks programnya adalah sebagai berikut:

Kode Program 18-1

tinclude <iostream>

using namespace std;

// Mendefinisikan fungsi generik dengan nama TUKAR // untuk menukar nilai dari dua buah variabel

template <class TIPEKU> void TUKAR(TIPEKU X, TIPEKU Y) { TIPEKU Z; // Mendeklarasikan variabel dengan tipe Til // Melakukan pertukaran antara variabel X dan Y

Z = X;

X = Y;

Y = Z;

// Fungsi utama int main() {

// Mendeklarasikan variabel J dan K yang bertipe int int J=100, K=200;

•'// Mendeklarasikan variabel A dan B yang bertipe char char A='A', B='B';

// Mendeklarasikan variabel Dl dan D2 yang bertipe double

;double Dl=25.02, D2 = 30.15;

// Menampilkan nilai mula-mula

cout«"Nilai sebelum dilakukan pertukaran"«endl«endl;

cout«"Nilai J cout«"Nilai K cout«endl ; cout« "Nilai A cout«"Nilai B

Memanggil fungsi TUKAR untuk tipe data yang berbeda-beda TUKAR(J, K ) ; // Parameter bertipe int

Bab 18: Template

\R(A, B) ; D2)

^FIjfjMenanipilkan nilai cout«"Nilai setelah cout«"Nilai J : cout«"Nilai K : cout«endl;

cout«"Nilai A : .cout«"Nilai B

cout«endl;

cout«"Nilai 1 cout«"Nila- :

/ Parameter bertipe char

// Parameter bertipe double akhir (setelah proses pertukaran) dilakukan pertukaran"«endl«endl;

Hasil yang akan didapatkan dari program di atas adalah sebagai berikut:

Nilai sebelum dilakukan pertukaran Nilai J

Nilai setelah dilakukan pertukaran Nilai J

Seperti yang terlihat di atas, bahwa sekali kita mendefinisikan fungsi TUKAR ( ) , kita dapat menggunakannya untuk tipe parameter yang berbeda-beda. Bentuk ini sebenarnya merupakan Pemrograman C++

bentuk penyederhanaan dari proses overloading function. Jika kita melakukan hal di atas dengan cara overload, maka kita harus mendefinisikan fungsi tersebut untuk setiap tipe data, artinya kita harus membuat tiga buah fungsi seperti yang terlihat di bawah inL

// Mendefinisikan fungsi untuk pertukaran variabel // yang bertipe int

void TUKAR(int X, int Y) { int Z = X;

X = Y;

Y = Z;

S

// Mendefinisikan fungsi untuk pertukaran variabel // yang bertipe char

void TUKAR(char X, char Y) { char Z = X;

X = Y;

Y = Z;

// Mendefinisikan fungsi untuk pertukaran variabel // yang bertipe double

void TUKAR (double X, double Y) { double Z = X;

X = Y;

Y = Z;

Berikut ini contoh lain yang akan menunjukkan pembuatan fungsi generik.

Kode Program 18-2

Mnclude <iostream>

using namespace std;

// Mendefinisikan fungsi geenrik dengan nama TambahSatu template <class TIPEKU> int TambahSatu(TIPEKU X) {

return (X+l);

// Fungsi utama int main() {

int A = 10;

char B = 'E';

double C = 2.03

// Mendeklarasikan variabel A bertipe int // Mendeklarasikan variabel B bertipe // char

// Mendeklarasikan variabel C // bertipe double

// Memanggil fungsi TambahSatu dan menampilkan hasilnya // ke layar

cout«TambahSatu (A) <<endl;

Bab 18: Template

cout«TambahSatu (B) cout«TambahSatu(C) return 0;

Hasil yang akan diberikan dari program di atas adalah sebagai berikut:

11 F 3.03

18.2.2 Template Fungsi dengan Dua Tipe Data Generik

Sebuah template fungsi dapat terdiri dari dua atau lebih tipe data generik. Adapun cara untuk mendefinisikannya adalah sama seperti kita menuliskan parameter yang lebih dari satu, yaitu dengan memisahkannya dengan tanda koma. Berikut ini contoh template fungsi yang menggunakan dua buah tipe data generik.

PIPEl, class TIPE2> void TULIS(TIPE1 X, TI

Fungsi upama it main ( ) {

// Mendeklarasikan variabel J yang bertipe long long J=2003;

// Mendeklarasikan variabel S yang bertipe char*

S = " Mengungkap Rahas i a C++" ; // Memanggil fungsi TULIS

TULIS(J, S) ; // Parameter bertipe long dan char*

TULIS("Oleh", "Budi Raharjo"); // Parameter foertipe char*

// dan char*

return 0;

Pemrograman C++

Hasil yang akan diberikan dari program di atas adalah sebagai berikut:

2003 Mengungkap Rahasia C+ + Oleh Budi Raharjo

18.2.3 Overload Template Fungsi

Sama halnya seperti fungsi-fungsi biasa, C++ juga mengizinkan kita untuk melakukan overload terhadap template fungsi. Berikut ini contoh program yang menunjukkan hal tersebut.

Kode Program 18-4

#include <iostream>

using namespace std;

// Mendefinisikan template fungsi TULIS // dengan satu tipe data generik template <class TIPE1>

void TULIS (TIPE1 X) { cout«X«endl ;

// Mendefinisikan template fungsi TULIS // dengan dua tipe data generik

template <class TIPE1, class TIPE2>

void TULIS (TIPE1 X, TIPE2 Y) { cout«X« ' ' «Y«endl ;

// Mendefinisikan template fungsi TULIS // dengan tiga tipe data generik

template <class TIPE1, class TIPE2, class TIPE3>

void TULIS(TIPE1 X, TIPE2 Y, TIPE3 Z) { cout«X«' V«Y«'

// Fungsi utama int main{) {

// Memanggil fungsi TULIS dengan tiga parameter bertipe char*

TULIS ( "Mengungkap", "Rahasia", "C++");

// Memanggil fungsi TULIS dengan tiga parameter bertipe char*

TULIS ("Penerbit", "INFORMATIKA", "Bandung");

// Memanggil fungsi TULIS dengan dua parameter bertipe char*

TULIS ("Budi", "Raharjo") ; Bab 18: Template

•ertipe long // Memanggil fungsi TULIS dengan satu pa,

TULIS(2003);

return 0;

Hasil yang akan diberikan dari program di atas adalah sebagai berikut:

Mengungkap Rahasia C+ + Penerbit INFORMATIKA Bandung Budi Raharjo

2003

Selain proses overload antar template fungsi, kita juga dapat melakukan overload template fungsi dengan fungsi biasa. Hal ini dinamakan dengan explicit specialization. Berikut ini contoh program yang menunjukkan proses tersebut.

mplate fungsi dengan nama TULIS yang raid TULIS(TIPEKU X) {

/ Mendefinisikan fungsi biasa dengan nama TULIS yang memiliki // dua parameter

void TULIS(int X, int Y) {

cout«"Di dalam fungsi biasa"«endl;

cout«X«" dan w«Y«endl ;

// Fungsi utama int main() {

// Mendeklarasikan variabel a dan b yang bertipe int int a=10, b=2Q;

f/ Memanggil fungsi template rULIS(a);

:out«endl ;

''/ Memanggil fungsi biasa rULIS(a, b ) ;

return 0;

Pemrograman C++

Hasil yang akan diberikan dari program di atas adalah sebagai berikut:

Di dalam template fungsi 10

Di dalam fungsi biasa 10 dan 20

18.2.4 Menggunakan Template Fungsi

Jika kita mempunyai sebuah algoritma yang bersifat umum dan dapat digunakan untuk tipe data yang berhubungan, maka sebaiknya kita menuangkannya ke dalam sebuah template fungsi.

Sebagai contoh, jika kita ingin membuat fungsi yang dapat melakukan pengumtan (sorting) data, tentu sebaiknya kita membuatnya ke dalam template karena akan dapat digunakan untuk tipe data yang berbeda (bilangan bulat, riil maupun karakter).

Berikut ini contoh program yang di dalamnya terdapat pembuatan template fungsi untuk proses pengurutan data.

Kode Program 18-6

tinclude <iostream>

using namespace std;

// Mendefinisikan template fungsi untuk proses pengurutan data yang berupa array

template <class TIPEKU> URUTKAN (

TIPEKU *P, // Pointer ke array yang akan diurutkan^

int N) // Jumlah elemen array TIPEKU X;

// Melakukan pengurutan for (int j = l ; j<N; j + + ) {

f o r (int k = ( N - l ) ; k>=l;

if (P[k-.ll > P [ k ] ) { X = P [ k - l ] ;

P [ k - l ] = P [ k ] ; P [ k ] - X;

k - - )

Bab 18: Template

' Fungsi utama it main () {

// array dari tipe int

int A[5J = { 20, 50, 40, 30, 10 };

/ array dari tipe double

ouble B[5] = { 2.13, 4.35, 1.02, 2.03, 1.75 / a r r a y dari tipe char

bar C [ 5 1 = { ' D ' , > B ' , ' E ' , ' C ' , 1A ' } ;

/ Mendeklarasikan variabel I sebagai indeks pengulangan nt I;

/ Menampilkan nilai sebelim dilakukan pengurutan data cout«"Sebelum diurutkan "«endl;

cout«"Nilai dari array A : ";

for (1=0; I<5; I++) { cout«A [!]

cout«"Nilai dari array B : ";

or (1=0; I<5;

illkan nilai setelah dilakukan pengurutan data

Pemrograman C++

cout«"Nilai dari array C for (1=0; I<5; I++) {

COUt«C[I]« ", ";

}

return 0;

Hasil yang akan diberikan dari program di atas adalah sebagai berikut:

Sebelum diurutkan

Nilai dari array A : 20, 50, 40, 30, 10

Nilai dari array B : 2.13, 4.35, 1.02, 2.03, 1.75 Nilai dari array C : D, B, E, C, A

Setelah diurutkan

Nilai dari array A : 10, 20, 30, 40, 50

Nilai dari array B : 1.02, 1.75, 2.03, 2.13, 4.35 Nilai dari array C : A, B, C, D, E

Dalam dokumen BAB 14 OPERATOR OVERLOADING (Halaman 36-40)

Dokumen terkait