Puji syukur kami panjatkan kepada Allah SWT atas rahmat dan karunia-Nya,
sehingga Modul Praktikum Pemrograman Berorientasi Obyek ini dapat diselesaikan. Modul ini
adalah panduan praktikum mata kuliah Pemrograman Berorientasi Obyek (PBO) yang
merupakan mata kuliah wajib yang harus diambil oleh setiap mahasiswa Program Studi
Teknik Informatika di Universitas Ibn Khaldun Bogor.
Modul praktikum ini terdiri dari 8 bab. Modul ini membahas dasar-dasar PBO secara
umum sehingga praktikumnya dapat menggunakan kompiler apa saja yang mendukung
bahasa C++ seperti Turbo C++, Borland C++ atau MS Visual C++.
Kami menyadari bahwa modul praktikum ini masih jauh dari sempurna. Saran dan
kritik yang membangun dari berbagai pihak sangatlah diharapkan.
DAFTAR ISI
KATA PENGANTAR
.............................................................................................
ii
BAB
BAB
BAB
........................................................
11
BAB
14
BAB
18
BAB
21
BAB
24
BAB
FRIEND ...............................................................................................
27
DAFTAR PUSTAKA
ii
BAB 1
DASAR-DASAR C++
Pendahuluan
Pada dasawarsa 1980-an terdapat suatu teknik pemrograman yang mendapat banyak
perhatian saat itu, yaitu pemrograman dengan pendekatan/berorientasi pada obyek (ObjectOriented Programming), yang lebih populer dengan sebutan OOP. Cara pemrograman ini
banyak melahirkan ide-ide maupun cara pandang/wawasan baru dalam dunia komputer
pada umumnya.
Berbagai macam cara dan strategi dilakukan untuk memasuki, menghadapi serta
menyiasati era OOP ini. Di antaranya adalah mengembangkan perangkat lunak (software)
yang ada agar dapat mendukung OOP. Salah satu lembaga yang melakukannya adalah Bell
Laboratories, tempat bahasa C dibuat. Di Bell Laboratories dikembangkan suatu
preprocessor bahasa C agar bahasa C dapat menggunakan OOP. Preprocessor ini
dikembangkan oleh Bjarne Stroustrup. Tetapi hasil yang dicapai tidak memuaskan.
Kemudian Bjarne Stroustrup merancang sebuah bahasa baru dengan menggunakan
bahasa C sebagai dasar ditambah dengan kemampuan untuk memproses program yang
dibuat secara OOP. Bahasa inilah yang kemudian dikenal dengan C++. Tahun 1984 Bjarne
Stroustrup menyusun buku The C++ Programming Language yang menjadi acuan bagi
perkembangan bahasa pemrograman C++ serta teknologi Object-Oriented pada
umumnya.
C++ diambil dari terminologi bahasa C untuk melambangkan kode C = C + 1, yang
artinya nilai C yang baru adalah nilai C yang lama ditambah 1. Hal ini melukiskan bahwa
bahasa C yang baru (C++) merupakan bahasa C yang lama ditambah dengan suatu
kemampuan baru (OOP).
C++ adalah bahasa C ditambah dengan kemampuan OOP. Oleh karena itu,
semua sintaks, pernyataan dan fungsi yang biasa digunakan dalam bahasa C
masih dapat digunakan dalam C++.
Perangkat lunak (software) yang dipergunakan adalah Turbo C++ atau Borland C++
yang diproduksi oleh Borland International. Untuk pemrograman di lingkungan Windows,
dipergunakan MS Visual C++ buatan Microsoft Corporation.
Dalam C++, program yang ditulis dengan bahasa pemrograman C atau C++
dibedakan dengan ekstensi nama berkas program tersebut. Program dengan bahasa
pemrograman C menggunakan ektensi .c sedangkan program dengan bahasa pemrograman
C++ menggunakan ekstensi .cpp.
atau
void main()
{
. . . . .
<statements>;
. . . . .
};
Dalam pembuatan fungsi juga terdapat sedikit perbedaan. Bila dalam bahasa C
penulisan fungsi dapat diletakkan sebelum maupun setelah fungsi main() atau fungsi
lainnya, dalam bahasa C++ tidak demikian halnya. Oleh karena adanya kemampuan
polimorfisme (polymorphism), fungsifungsi dalam bahasa pemrograman C++ harus
mengetahui tipe data dari parameter atau argumen fungsifungsi tersebut pada saat fungsi
fungsi tersebut dipanggil.
Jika penulisan fungsi diletakkan sebelum fungsi main() atau fungsi lainnya maka
secara langsung tipe data dari parameter atau argumen fungsi telah diketahui pada saat
fungsi tersebut dipanggil dari program utama (fungsi main()) atau dari fungsi lainnya.
Tetapi jika penulisan fungsi diletakkan setelah fungsi main atau fungsi lainnya maka pada
saat fungsi tersebut dipanggil dari fungsi-fungsi sebelumnya (baik fungsi main() atau fungsi
lainnya), tipe data dari parameter atau argumen fungsi tersebut belum diketahui.
Untuk mengatasi hal tersebut kita mengenal adanya prototipe fungsi (function
prototype) dalam bahasa pemrograman C++. Prototipe fungsi ini dapat kita anggap sebagai
fungsi yang belum sempurna, karena hanya terdiri dari kepala (header) suatu fungsi saja.
Prototipe fungsi ini diletakkan sebelum fungsifungsi yang memanggil fungsi tersebut.
Kegunaannya adalah agar pada saat suatu fungsi dipanggil, tipe data dari parameter atau
argumennya telah diketahui. Hal ini mirip dengan kegunaan reserved word forward pada
Turbo Pascal. Sedangkan penulisan fungsi secara lengkapnya dapat diletakkan di mana saja,
setelah fungsi main(), dalam berkas lain atau bahkan dalam berkas fungsi pustaka (library).
<tipe data> namafungsi (<tipe data> argumen1, <tipe data> argumen2, ...); //
prototipe fungsi
void main()
{
. . .
namafungsi (arg1,arg2, . . .);
. . .
};
Dasar-Dasar C++
main()
Sebuah program C++ minimal mengandung sebuah fungsi yaitu main(). Fungsi ini
merupakan fungsi awal dan utama yang akan dieksekusi dalam program C++.
cout
Obyek cout (baca: C out) berguna untuk menuliskan angka atau teks ke peranti
keluaran standar (biasanya layar monitor). Obyek ini adalah pengganti fungsi printf() dalam
PBO yang memiliki fleksibilitas dan kemudahan penggunaan yang lebih baik. Fungsi printf()
masih dapat digunakan, tetapi anda disarankan untuk membiasakan diri menggunakan
obyek cout untuk mulai masuk ke OOP.
escape sequence characters
Escape sequence characters adalah karakter-karakter khusus yang mempunyai arti
tersendiri ketika dikirim ke standar output. Tabel di bawah ini berisi karakter-karakter
khusus tersebut.
Karakter
Keterangan
\0
\a
\b
Karakter backspace
\f
\n
\r
\t
\v
\\
Karakter \
Karakter
Karakter
\?
Karakter ?
\ooo
\xhh
manipulator
Manipulator digunakan untuk mengatur tampilan data. Misalnya untuk mengatur agar
suatu nilai ditampilkan dengan lebar 10 karakter dan rata kanan. Berikut ini sejumlah
manipulator yang digunakan pada C++.
Manipulator
Keterangan
Endl
Menyisipkan newline
Ends
Flush
Dec
Hex
Oct
setbase (int n)
setw (int n)
setfill (int c)
setprecision (int n)
setiosflags (long f)
resetiosflags (long f)
Tanda Format
Keterangan
ios::left
Menyetel rata kiri terhadap lebar field yang diatur oleh setw()
ios::right
Menyetel rata kanan terhadap lebar field yang diatur oleh setw()
ios::scientific
ios::dec
ios::hex
ios::oct
ios::uppercase
ios::showbase
ios::showpoint
ios::showpos
cin
Obyek cin (baca: C in) membaca semua teks atau angka yang masuk ke standar
input (normalnya adalah keyboard).
cerr
Obyek cerr (baca: C err) membaca semua teks atau angka yang masuk ke standar
error (normalnya adalah layar monitor).
Latihan
Dua buah program di bawah ini adalah contoh penggunaan obyek cout, cin, escape
sequence characters, manipulator, format ios serta obyek cerr sebagai pengantar untuk
mempelajari C++ lebih jauh.
Program 1.1 ctof.cpp
// Program mengkonversi nilai suhu
// dari celcius ke fahrenheit
#include <iostream.h>
#include <iomanip.h>
void main()
{
char nama[30];
double c, f;
char yt;
cout << "Masukkan nama Anda: ";
cin >> nama;
cout << "Hai \"" << nama << "\"..." << endl;
Hasil output:
D:\My Documents\My Modules\cerr\Debug>cerr > nama.txt
Anda ingin tahu siapa nama saya?
Masukkan password: password
Yup. Silakan buka file outputnya.
D:\My Documents\My Modules\cerr\Debug>type nama.txt
Nama saya adalah: My Girl.
BAB 2
DASAR-DASAR KELAS DAN OBYEK
Pendahuluan
Dalam bahasa pemrograman C, kita mengenal tipe data struktur (structure) yang
digunakan untuk menggambarkan suatu entitas. Tetapi penggambaran tersebut belumlah
memuaskan, sebab karakteristik atau operasi-operasi yang dapat dilakukan oleh/pada
entitas tersebut tidak terwakilkan. Dalam bahasa pemrograman C++ kemampuan tipe data
struktur dikembangkan sehingga dapat juga menampung operasi-operasi yang dimiliki oleh
entitas tersebut, sehingga penggambaran entitas/obyek tersebut menjadi lebih lengkap.
Tipe data ini dikenal dengan tipe data obyek. Sebelum membuat sebuah obyek,
terlebih dahulu kita harus mendefinisikan jenis obyek yang akan dibuat yang disebut dengan
kelas. Dalam C++, Kelas obyek didefinisikan dengan menggunakan reserved word class.
obyek
2.
Pewarisan atau penurunan (inheritance), adalah kemampuan kelas suatu obyek untuk
menurunkan sifat-sifat yang dimilikinya kepada kelas lain.
3.
Polimorfisme (polymorphism), yaitu metoda dengan nama yang sama pada sebuah kelas
obyek dapat memiliki operasi yang berbeda tergantung dari jumlah dan atau jenis
argumen yang diterimanya.
Analoginya dengan obyek pada dunia nyata adalah sebagai berikut.
Manusia adalah contoh sebuah kelas. Mamat adalah contoh instan dari kelas manusia
dan disebut sebagai obyek. Karena Mamat adalah seorang manusia maka Mamat mewarisi
sifat-sifat manusia pada umumnya seperti memiliki mata, hidung dan dapat berpikir
inheritance. Sifat-sifat (atribut) dan tingkah laku atau cara bertindak (metoda) Mamat
menyatu pada dirinya encapsulation. Mamat dapat melakukan pekerjaan makan.
Seandainya kepada Mamat diberikan nasi goreng dan kacang garing, Mamat akan memakan
keduanya tetapi tentu saja dengan cara yang berbeda. Untuk memakan nasi goreng, Mamat
memerlukan piring dan sendok, mengambil nasi, barulah makan. Untuk memakan kacang
garing, cukup menggunakan tangan, dikupas kulitnya, barulah dimakan kacangnya
polymorphisme.
Data
Obyek 1
Data
Kelas
Fungsi
Program Non-OOP
Fungsi
Anggota
Obyek 2
Program OOP
Setiap atribut (data), metoda (fungsi anggota) bahkan obyek pada suatu obyek
(sebuah obyek dapat berisi obyek lain) memiliki hak akses tersendiri. Apakah hak akses itu?
Hak akses adalah hak yang dimiliki oleh anggota dari suatu obyek untuk menentukan
apakah ia dapat diakses atau tidak dapat diakses.
Ada 3 jenis hak akses dalam bahasa pemrograman C++:
private: hanya dapat diakses oleh anggota obyek itu sendiri.
public: dapat diakses oleh siapa saja.
protected: hanya dapat diakses oleh anggota obyek itu sendiri dan obyek kelas
turunannya.
Latihan
Program 2.1 class.cpp
// Contoh pembuatan dan penggunaan kelas
#include <iostream.h>
#include <string.h>
class Manusia
{
private:
char nama[30];
float umur;
char alamat[50];
public:
void Init(char* sNama, float nUmur, char* sAlamat)
{
strcpy(nama, sNama);
umur = nUmur;
strcpy(alamat, sAlamat);
}
void Info()
{
cout << "Nama
: " << nama << endl;
cout << "Umur
: " << umur << endl;
cout << "Alamat : " << alamat << endl;
}
};
void main()
{
Manusia mamat;
mamat.Init("Mamat Setiamat", 18, "Kedung Badak Bogor");
mamat.Info();
}
Hasil output:
Nama
: Mamat Setiamat
Umur
: 18
Alamat : Kedung Badak Bogor
Tugas
Pada Program 2.1 di atas, pengisian data nama, umur dan alamat dilakukan secara
langsung dari dalam program dengan memanggil fungsi anggota Init(). Modifikasilah
program di atas sehingga pengisian data nama, umur dan alamat dilakukan melalui input
dari papan ketik oleh pengguna.
10
BAB 3
KONSTRUKTOR DAN DESTRUKTOR
Pendahuluan
Salah satu kekuatan OOP adalah adanya konstruktor dan destruktor untuk mengatur
segala hal yang berkenaan dengan penciptaan (construction/instantiation) dan pemusnahan
(destruction) obyek. Sehingga, pengesetan nilai-nilai variabel maupun pengeksekusian
pernyataan (statement) dapat dilakukan pada saat obyek tersebut diciptakan maupun
dimusnahkan.
Konstruktor
Konstruktor adalah fungsi anggota sebuah obyek yang akan dieksekusi sesaat
setelah obyek tersebut diciptakan. Aturan-aturan untuk menciptakan sebuah konstruktor
suatu kelas, yaitu:
1. Nama fungsi anggota konstruktor sama dengan nama kelas.
2. Sebuah konstruktor dapat mempunyai argumen dan nilai default seperti layaknya
sebuah fungsi anggota biasa.
3. Sebuah konstruktor tidak boleh memiliki nilai kembali fungsi (return value). Bahkan void
pun tidak boleh.
4. Sebuah konstruktor harus diletakkan pada bagian public.
Destruktor
Serupa dengan konstruktor, Destruktor adalah fungsi anggota yang sebuah obyek
yang akan dieksekusi sesaat sebelum obyek tersebut dimusnahkan. Aturan-aturan untuk
menciptakan sebuah destruktor suatu kelas, yaitu:
1. Nama fungsi anggota destruktor sama dengan nama kelas ditambah awalan karakter
not (~).
2. Sebuah destruktor tidak boleh mempunyai argumen fungsi.
3. Sebuah destruktor tidak boleh mempunyai nilai kembali fungsi (return value). Bahkan
void pun tidak boleh.
4. Sebuah destruktor harus diletakkan pada bagian public.
Latihan
Pada Program 2.1, kelas Manusia tidak memiliki konstruktor maupun destruktor.
Kita dapat mengasumsikan konstruktor pada kelas Manusia sebagai atribut-atribut bawaan
pada seseorang ketika orang tersebut baru lahir (bayi), dan destruktor sebagai atributatribut bawaan pada seseorang ketika orang tersebut hampir meninggal. Anda dapat
11
memodifikasi Program 2.1 di atas menjadi seperti di bawah ini untuk melihat efek
konstruktor maupun destruktornya.
Program 3.1 construc.cpp
// Kelas dengan konstruktor dan destruktor
#include <iostream.h>
#include <string.h>
class Manusia
{
private:
char nama[30];
float umur;
char alamat[50];
public:
Manusia()
// konstruktor
{
strcpy(nama, "Belum punya nama");
umur = 0;
strcpy(alamat, "Sama dengan alamat orang tua");
cout << "Alhamdulillah, bayinya lahir..." << endl << endl;
}
~Manusia() // destruktor
{
cout << "Innalillah, " << nama << " akhirnya meninggal..." <<
endl;
}
void SetAtribut(char* sNama, float nUmur, char* sAlamat)
{
cout << "Set atribut..." << endl << endl;
strcpy(nama, sNama);
umur = nUmur;
strcpy(alamat, sAlamat);
}
void Info()
{
cout << "Nama
: " << nama << endl;
cout << "Umur
: " << umur << endl;
cout << "Alamat : " << alamat << endl << endl;
}
};
void main()
{
Manusia mamat;
mamat.Info();
12
Tugas
1.
Pada program di atas, penulisan fungsi anggota dilakukan di dalam kelas. Untuk sebuah
fungsi anggota yang besar, bentuk penulisan fungsi seperti di atas tidak disarankan.
Yang perlu ditulis di dalam kelas cukup deklarasi fungsinya saja, sementara penjabaran
atau definisi fungsi anggotanya ditulis di luar kelas. Untuk menuliskan fungsi anggota di
luar kelas, bentuknya sebagai berikut:
<NamaKelas>::<FungsiAnggota>[(argumen)]
Misalnya untuk fungsi anggota SetAtribut, ditulis menjadi:
void Manusia::SetAtribut(char* sNama, float nUmur, char* sAlamat)
{
}
Ubahlah bentuk penulisan semua fungsi anggota program di atas menjadi di luar kelas!
2.
Potongan program yang berisi deklarasi sebuah kelas dapat dipisahkan ke dalam sebuah
file header tersendiri untuk kemudian disertakan di dalam program menggunakan
praprosesor #include. Pisahkan deklarasi kelas Manusia di atas ke dalam sebuah file
header Manusia.h, lalu sertakan di dalam program utama!
13
BAB 4
INHERITANCE (PEWARISAN)
Pendahuluan
Pada C++, sebuah kelas dimungkinkan untuk mewarisi data maupun fungsi anggota
kelas lain. Sifat ini disebut dengan pewarisan (inheritance). Kelas yang mewarisi sifat kelas
lain disebut kelas turunan (derived class), sedangkan kelas yang mewariskan sifatnya ke
kelas lain disebut sebagai kelas dasar (base class). Sifat pewarisan ini diilhami oleh sifat
pewarisan pada kehidupan nyata. Misalnya, mata si Mamat mirip dengan mata ayahnya dan
hidungnya yang mancung mirip dengan hidung ibunya.
Dasar Pewarisan
Agar sebuah kelas dapat mewarisi sifat dari kelas lain, pada deklarasi kelasnya
ditambahkan pernyataan sebagai berikut:
class Turunan : [<private>|<protected>|<public>] class Dasar,
Bila pewarisan
bersifat
private
protected
public
private
protected
private
public
private
private
protected
protected
public
protected
private
protected
protected
public
public
Jika sebuah kelas hanya mewarisi sifat dari satu kelas lain, pewarisan seperti ini
disebut sebagai pewarisan tunggal. Jika sebuah kelas mewarisi sifat dari dua atau lebih kelas
lain, pewarisannya disebut sebagai pewarisan jamak (berganda). Jika sebuah kelas mewarisi
sifat langsung dari sebuah kelas dasar, pewarisannya disebut sebagai pewarisan langsung
(satu tingkat). Jika sebuah kelas mewarisi sifat dari sebuah kelas turunan lain, pewarisannya
disebut sebagai pewarisan bertingkat.
Ketika sebuah obyek dari kelas turunan dibuat, maka konstruktor dari kelas dasar
dijalankan terlebih dahulu, barulah konstruktor dari kelas turunan dijalankan. Sebaliknya,
14
Ketika sebuah obyek dari kelas turunan dihancurkan, maka destruktor dari kelas turunan
dijalankan terlebih dahulu, barulah destruktor dari kelas dasar dijalankan.
Latihan
Program berikut ini memberikan gambaran yang cukup jelas mengenai sifat
pewarisan pada C++.
Program 4.1 inherit.cpp
// Pewarisan sifat
#include <iostream.h>
#include <string.h>
class Bapak
{
private:
char sNama[30];
protected:
void Info()
{
cout << "Nama Bapak: " << sNama << endl;
}
public:
Bapak(char* nama="Bejo")
{
cout << "Konstruktor Bapak dijalankan..." << endl;
strcpy(sNama, nama);
}
~Bapak()
{
cout << "Destruktor Bapak dijalankan..." << endl;
}
};
class Ibu
{
private:
char sNama[30];
protected:
void Info()
{
cout << "Nama Ibu
}
public:
Ibu(char* nama="Surti")
{
15
Hasil output:
16
17
BAB 5
FUNGSI SEMU
(VIRTUAL FUNCTION)
Pendahuluan
Pada dasarnya, suatu obyek kelas dasar tidak dapat mengakses fungsi anggota yang
dimiliki oleh kelas turunannya, bahkan dalam bentuk obyek dinamis (pointer) sekalipun.
Agar sebuah obyek kelas dasar dapat melakukan hal itu, digunakan fungsi semu (virtual).
Dengan fungsi virtual, pada obyek kelas dasar dibuat memiliki akses terhadap fungsi
anggota pada kelas turunannya. Implementasi dari obyek tersebut nantinya ada pada kelaskelas turunannya masing-masing.
Fungsi Semu
Fungsi virtual digunakan dalam bentuk obyek dinamis (pointer). Caranya adalah
sebagai berikut.
Pertama-tama dibuat obyek pointer dengan tipe kelas dasar. Kemudian dibuat pula
obyek-obyek kelas turunannya. Pointer tersebut selanjutnya diarahkan untuk menunjuk
kepada salah satu dari obyek-obyek kelas turunannya. Dengan cara seperti ini, pointer
obyek tersebut dapat mengakses fungsi-fungsi anggota pada kelas turunannya, dengan
syarat bahwa fungsi-fungsi tersebut telah didefinisikan sebagai fungsi virtual pada kelas
dasarnya.
Suatu fungsi anggota yang dibuat sebagai fungsi virtual perlu dideklarasikan ulang
pada setiap kelas turunan yang ingin menggunakannya. Bentuk pendeklarasiannya harus
sama baik nilai kembali maupun argumen-argumennya, hanya saja kata kunci virtual tidak
diberikan pada kelas turunannya.
Latihan
18
};
class Kakek: public Manusia
{
public:
void info()
{
cout << "Sekarang saya sudah tua." << endl;
}
};
class Bapak: public Kakek
{
public:
void info()
{
cout << "Saya sudah jadi bapak." << endl;
}
};
class Anak: public Bapak
{
public:
void info()
{
cout << "Saya masih anak-anak." << endl;
}
};
void main()
{
Anak nak;
Bapak pak;
Kakek kek;
Manusia *m;
m = &nak;
m->info();
m = &pak;
m->info();
m = &kek;
m->info();
}
Hasil output:
Saya masih anak-anak.
Saya sudah jadi bapak.
Sekarang saya sudah tua.
19
Tugas
Program di atas menggunakan fungsi virtual murni pada kelas dasar Manusia, yaitu fungsi
info(). Hilangkan kata kunci virtual pada fungsi info(), dan ganti isi fungsi info() menjadi
sebagai berikut:
void info()
{
cout << Saya adalah manusia. << endl;
}
Jalankan program dan amatilah hasil yang didapat.
20
BAB 6
OVERLOADING OPERATOR
Pendahuluan
Konsep overloading terhadap operator diilhami oleh operasi yang sering kita alami
sehari-hari. Misalnya operator + biasa digunakan untuk menjumlahkan dua buah bilangan
bulat atau bilangan pecahan:
2+3
5.2 + 7.6
Operasi seperti ini adalah hal biasa yang dijumpai di setiap bahasa pemrograman,
tetapi operasi berikut:
3 apel + 5 jeruk
matriks A + matriks B
(harganya = )
(matriks hasil = )
21
}
. . .
}
Tidak semua operator pada C++ dapat di-overload. Kita tidak dapat melakukan
overloading terhadap 5 buah operator pada C++, yaitu: ., .*, ::, ?: dan sizeof.
Latihan
};
class Apel: public Buah
{
public:
Apel (int jumlah=0, float harga=0.0)
{
jumlah_buah = jumlah;
harga_buah = harga;
}
void info()
22
{
cout << "Jumlah apel
cout << "Harga apel
}
};
class Jeruk: public Buah
{
public:
Jeruk (int jumlah=0, float harga=0.0)
{
jumlah_buah = jumlah;
harga_buah = harga;
}
void info()
{
cout << "Jumlah jeruk : " << jumlah_buah << endl;
cout << "Harga jeruk : " << harga_buah << endl;
}
};
void main()
{
Buah buah;
Apel apel (6, 9000);
Jeruk jeruk (10, 5000);
apel.info();
jeruk.info();
buah = apel + jeruk;
buah.info();
}
Hasil output:
Jumlah apel
Harga apel
Jumlah jeruk
Harga jeruk
Total buah
Total harga
:
:
:
:
:
:
6
9000
10
5000
16
14000
23
BAB 7
POLIMORFISME
(OVERLOADING FUNGSI)
Pendahuluan
Polimorfisme berasal dari bahasa Yunani yang berarti memiliki banyak bentuk. Dalam
C++, polimorfisme berarti sebuah fungsi anggota dengan nama yang sama tetapi memiliki
jenis argumen dan atau jumlah argumen dan atau nilai kembali fungsi yang berbeda.
Polimorfisme merupakan jenis overloading pada fungsi anggota sebuah kelas.
Dalam dunia nyata, contoh dari sebuah polimorfisme adalah sebagai berikut.
Misalnya ada makanan nasi goreng dan buah pisang. Terdapat pernyataan sebagai berikut:
Mamat makan nasi goreng.
Mamat makan pisang.
Pada dua pernyataan di atas, Mamat melakukan pekerjaan makan. Tetapi cara
Mamat memakan nasi goreng tentunya berbeda dengan cara Mamat makan pisang. Untuk
memakan nasi goreng, Mamat perlu menggunakan sendok untuk memakannya. Sedangkan
untuk memakan buah pisang, Mamat harus mengupas terlebih dahulu kulit pisangnya, baru
kemudian dimakan menggunakan tangan.
Polimorfisme
Untuk menjadikan sebuah fungsi anggota suatu kelas dalam C++ agar memiliki
kemampuan polimorfisme, caranya mudah. Cukup tuliskan fungsi tersebut apa adanya
seolah-olah sebagai fungsi yang berdiri sendiri. Misalnya kita hendak membuat fungsi
anggota Makan() dengan argumen fungsi berupa Nasi Goreng atau Pisang.
void Makan(NasiGoreng *nasgor)
{
cout << "Nyam nyam nyam..." << endl;
cout << "Nasi gorengnya enak..." << endl << endl;
}
void Makan(Pisang *pisang)
{
cout << "Nyam nyam nyam..." << endl;
cout << "Pisangnya enak..." << endl << endl;
}
Dalam hal ini respon yang diberikan fungsi anggota Makan() akan berbeda sesuai
dengan argumen yang diberikan: NasiGoreng atau Pisang.
24
Latihan
25
void main()
{
Manusia mamat;
NasiGoreng nasgor;
mamat.Makan (&nasgor);
Pisang pisang;
mamat.Makan (&pisang);
cout << "Program berakhir..." << endl << endl;
}
Hasil output:
Nasi digoreng.. jadi Nasi Goreng.
Ditaro di piring. Ambil sendok.
Nyam nyam nyam...
Nasi gorengnya enak...
Pisang dipetik.
Dikupas dulu kulitnya.
Nyam nyam nyam...
Pisangnya enak...
Program berakhir...
Pisangnya abis...
Nasi gorengnya abis...
26
BAB 8
FRIEND
Pendahuluan
Konsep dasar dari pemrograman berorientasi obyek adalah pengkapsulan. Semua
fungsi atau kelas lain yang hendak mengakses elemen private dari sebuah kelas harus
melalui fungsi anggota dalam kelas tersebut, tidak bisa langsung. Begitu pula elemenelemen protected sebuah kelas hanya dapat diakses oleh kelas tersebut dan kelas-kelas
turunannya. Hal ini dimaksudkan untuk menjaga konsep obyek secara murni.
Tetapi adakalanya kita memerlukan jalan pintas untuk menyederhanakan struktur
program atau memecahkan permasalahan yang hanya dapat dilakukan apabila sebuah kelas
atau fungsi dapat mengakses bagian private kelas lain. Maka diciptakanlah konsep fungsi
atau kelas yang disebut dengan friend. Friend secara umum bertentangan atau telah
melanggar konsep pengkapsulan pada OOP. Oleh karena itu, penggunaan friend sebaiknya
dihindarkan atau jangan digunakan kecuali apabila benar-benar dibutuhkan. Kalaupun
digunakan, jangan terlalu banyak friend yang dibuat karena akan meruntuhkan sifat
pengkapsulan sebuah kelas. Analogi friend (teman) dalam dunia nyata adalah sebagai
berikut.
Katakanlah anda tinggal di sebuah kamar kost yang berisi barang-barang pribadi.
Tentunya anda tidak ingin teman Anda keluar masuk sesuka hati ke kamar anda. Tetapi
ketika liburan tiba, anda harus kembali ke kampung halaman untuk satu bulan. Selama di
kampung halaman, anda tidak ingin kamar anda kotor berdebu tidak terawat. Untuk itu
anda menitipkan kunci kepada teman anda dan berpesan agar beliau merawat kamar anda
selama anda pergi. Dalam hal ini, teman anda telah melanggar kebiasaan umum yaitu tidak
boleh masuk sesuka hati ke kamar anda.
27
Latihan
Program di bawah ini memberikan gambaran mengenai sifat friend pada sebuah
fungsi yang digunakan untuk menentukan mana di antara dua buah obyek bertipe Manusia
yang lebih tua.
Program 8.1 poly.cpp
// Friend...
#include <iostream.h>
#include <string.h>
class Manusia
{
private:
char nama[30];
int umur;
public:
Manusia (char* Nama="", int Umur=0)
{
strcpy(nama, Nama);
umur = Umur;
}
void info()
{
cout << "Nama : " << nama << endl;
cout << "Umur : " << umur << endl << endl;
}
friend Manusia LebihTua (Manusia m1, Manusia m2);
};
void main()
{
Manusia
Manusia
Manusia
Manusia
mimin("Mimin", 32);
kokom("Kokom", 34);
siti("Siti", 29);
tertua;
mimin.info();
kokom.info();
siti.info();
cout << "Yang tertua di antara mereka adalah..." << endl << endl;
28
29
DAFTAR PUSTAKA
30