Anda di halaman 1dari 32

KATA PENGANTAR

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.

Bogor, Oktober 2014


Penyusun

Foni Agus Setiawan, S.Kom., M.Kom.

DAFTAR ISI

KATA PENGANTAR

.............................................................................................

DAFTAR ISI .......................................................................................................

ii

BAB

DASAR-DASAR C++ .............................................................................

BAB

DASAR-DASAR KELAS DAN OBYEK ..........................................................

BAB

KONSTRUKTOR DAN DESTRUKTOR

........................................................

11

BAB

PEWARISAN (INHERITANCE) .................................................................

14

BAB

FUNGSI SEMU (VIRTUAL FUNCTION) ......................................................

18

BAB

OVERLOADING OPERATOR ....................................................................

21

BAB

POLIMORFISME (OVERLOADING FUNGSI) ................................................

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.

Laboratorium Komputer Ilkom Unpak Bogor

Foni Agus Setiawan


Bahasa pemrograman C++ memiliki struktur program yang mirip dengan bahasa
pemrograman C dengan sedikit perbedaan di sana-sini. Dalam bahasa pemrograman C++
semua fungsi harus memiliki tipe data hasil/pengembalian (return data type) dan nilai hasil
(return value) termasuk juga fungsi main(). Tidak seperti dalam bahasa pemrograman C
yang fungsinya secara default bertipe data hasil integer, dalam bahasa pemrograman C++
kita harus menentukan tipe data hasil dari suatu fungsi. Tipe data yang sering digunakan
untuk tipe data hasil dari fungsi main() adalah integer atau void.
Struktur utama program C++ adalah:
int main()
{
. . . . .
<statements>;
. . . . .
return 0;
};

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, . . .);
. . .
};

Laboratorium Komputer TI FT UIKA Bogor

Foni Agus Setiawan


<tipe data> namafungsi (<tipe data> argumen1, <tipe data> argumen2, ...); //
fungsi lengkap
{
. . .
<statements>;
. . .
};

Penggunaan berkas tambahan stdio.h juga mengalami perubahan. Dalam bahasa


pemrograman C++ penggunaannya sering digantikan oleh berkas tambahan baru
iostream.h yang telah menggunakan teknik pemrograman yang berorientasi pada obyek.
Berkas ini memberikan 2 obyek yaitu cin dan cout sebagai pengganti parameter stdin dan
stdout dari berkas stdio.h untuk menangani peralatan masukan dan keluaran (input/output
device).

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

Karakter null (nilai ascii 0)

\a

Membunyikan speaker komputer

\b

Karakter backspace

\f

Karakter formfeed (ganti halaman)

\n

Karakter newline (ganti baris)

\r

Karakter carriage return (ke posisi kolom pertama pada baris


saat itu, tanpa pindah baris)

\t

Karakter tab horisontal

\v

Karakter tab vertikal

\\

Karakter \

Laboratorium Komputer TI FT UIKA Bogor

Foni Agus Setiawan


\

Karakter

Karakter

\?

Karakter ?

\ooo

Karakter dengan nilai oktal ooo

\xhh

Karakter dengan nilai heksadesimal hh


Tabel 1.1 Escape sequence characters pada C++.

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

Menyisipkan karakter null

Flush

Mengirimkan isi buffer ke piranti keluaran

Dec

Mengkonversi ke bilangan basis 10 (desimal)

Hex

Mengkonversi ke bilangan basis 16 (heksadesimal)

Oct

Mengkonversi ke bilangan basis 8 (oktal)

setbase (int n)

Mengkonversi ke bilangan basis n (n = 8, 10 atau 16)

setw (int n)

Mengatur lebar field untuk suatu nilai sebesar n karakter.


Jika tidak didefinisikan dengan setfill(), karakter pemenuh
berupa spasi.

setfill (int c)

Menyetel karakter pemenuh berupa karakter c.

setprecision (int n)

Menyetel presisi bilangan pecahan sebesar n digit.

setiosflags (long f)

Menyetel format yang ditentukan oleh f. f adalah tanda


format pada tabel 1.3

resetiosflags (long f)

Menghapus format yang ditentukan oleh f. f adalah tanda


format pada tabel 1.3
Tabel 1.2 Manipulator-Manipulator pada C++.

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

Memformat keluaran dalam notasi eksponensial

Laboratorium Komputer TI FT UIKA Bogor

Foni Agus Setiawan


ios::fixed

Memformat keluaran dalam notasi desimal

ios::dec

Memformat keluaran dalam basis 10 (desimal)

ios::hex

Mengkonversi ke bilangan basis 16 (heksadesimal)

ios::oct

Mengkonversi ke bilangan basis 8 (oktal)

ios::uppercase

Memformat huruf notasi heksadesimal dalam huruf besar

ios::showbase

Menampilkan awalan 0x untuk bilangan heksadesimal atau 0 (nol)


untuk bilangan oktal

ios::showpoint

Menampilkan titik desimal pada bilangan yang tidak memiliki


bagian pecahan

ios::showpos

Menampilkan tanda + pada bilangan positif


Tabel 1.3 Tanda format untuk setiosflags() dan resetiosflags().

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;

Laboratorium Komputer TI FT UIKA Bogor

Foni Agus Setiawan


yt='Y';
while((yt=='Y') || (yt=='y'))
{
cout << "\nMasukkan nilai suhu dalam celcius: ";
cin >> c;
f = 9.0 / 5.0 * c + 32.0;
cout << "Nilai suhu dalam fahrenheit: "
<< setw(12) << setiosflags(ios::right | ios::scientific)
<< setprecision(2) << f << endl;
cout << "Mau nyoba lagi (y/t)? ";
cin >> yt;
}
}
Hasil output:
Masukkan nama Anda: Jay
Hai "Jay"...
Masukkan nilai suhu dalam celcius: 28
Nilai suhu dalam fahrenheit:
8.24e+001
Mau nyoba lagi (y/t)? y
Masukkan nilai suhu dalam celcius: 30
Nilai suhu dalam fahrenheit:
8.60e+001
Mau nyoba lagi (y/t)? t
Program 1.2 cerr.cpp
// program password dengan redirection
// ke sebuah file teks
#include <iostream.h>
#include <string.h>
void main()
{
char pass[8];
cerr << "Anda ingin tahu siapa nama saya?" << endl;
cerr << "Masukkan password: ";
cin >> pass;
if (strcmp(pass,"password")==0)
{
cout << "Nama saya adalah: My Girl." << endl;
cerr << "Yup. Silakan buka file outputnya." << endl;
}
else
cerr << "Sorry, saya nggak bisa bilang. Password Anda salah." <<
endl;
}

Laboratorium Komputer TI FT UIKA Bogor

Foni Agus Setiawan

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.

Laboratorium Komputer TI FT UIKA Bogor

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.

Dasar-Dasar Kelas dan Obyek


Sebuah bahasa pemrograman berorientasi obyek memiliki 3 karakteristik utama yang
membedakannya dari bahasa non-OOP, yaitu:
1.

Pengkapsulan atau pembungkusan (encapsulation), adalah kemampuan


memadukan data dan operasi-operasi dari dan pada obyek tersebut.

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.

Laboratorium Komputer Ilkom Unpak Bogor

Data

Obyek 1

Data
Kelas

Fungsi

Program Non-OOP

Fungsi
Anggota

Obyek 2
Program OOP

Gambar 2.1 Perbedaan arsitektur program Non-OOP dengan 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);

Laboratorium Komputer TI FT UIKA Bogor

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.

Laboratorium Komputer TI FT UIKA Bogor

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

Laboratorium Komputer TI FT UIKA Bogor

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();

Laboratorium Komputer TI FT UIKA Bogor

12

mamat.SetAtribut ("Mamat Setiamat", 18, "Kedung Badak Bogor");


mamat.Info();
cout << Program berakhir... << endl;
}
Hasil output:
Alhamdulillah, bayinya lahir...
Nama
: Belum punya nama
Umur
: 0
Alamat : Sama dengan alamat orang tua
Set atribut...
Nama
: Mamat Setiamat
Umur
: 18
Alamat : Kedung Badak Bogor
Program berakhir...
Innalillah, Mamat Setiamat akhirnya meninggal...

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!

Laboratorium Komputer TI FT UIKA Bogor

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

Data dan fungsi anggota di


kelas dasar bersifat

Maka akses data dan fungsi di


kelas turunan menjadi bersifat

private

private (tidak diwariskan)

protected

private

public

private

private

private (tidak diwariskan)

protected

protected

public

protected

private

private (tidak diwariskan)

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,

Laboratorium Komputer TI FT UIKA Bogor

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
}

: " << sNama << endl;

public:
Ibu(char* nama="Surti")
{

Laboratorium Komputer TI FT UIKA Bogor

15

cout << "Konstruktor Ibu dijalankan..." << endl;


strcpy(sNama, nama);
}
~Ibu()
{
cout << "Destruktor Ibu dijalankan..." << endl;
}
};
class Anak : public Bapak, public Ibu
{
private:
char sNama[30];
public:
Anak(char* nama)
{
cout << "Konstruktor Anak dijalankan..." << endl;
strcpy(sNama, nama);
}
~Anak()
{
cout << "Destruktor Anak dijalankan..." << endl;
}
void Info()
{
cout << endl << "I N F O" << endl;
Bapak::Info();
Ibu::Info();
cout << "Nama Anak : " << sNama << endl << endl;
}
};
void main()
{
Anak mamat("Mamat");
mamat.Info();
cout << "Program berakhir..." << endl << endl;
}

Hasil output:

Laboratorium Komputer TI FT UIKA Bogor

16

Konstruktor Bapak dijalankan...


Konstruktor Ibu dijalankan...
Konstruktor Anak dijalankan...
I N F O
Nama Bapak: Bejo
Nama Ibu : Surti
Nama Anak : Mamat
Program berakhir...
Destruktor Anak dijalankan...
Destruktor Ibu dijalankan...
Destruktor Bapak dijalankan...

Laboratorium Komputer TI FT UIKA Bogor

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

Program di bawah ini memberikan gambaran mengenai penggunaan fungsi virtual


untuk fleksibilitas pemrograman.
Program 5.1 virtual.cpp
// Penggunaan fungsi virtual
#include <iostream.h>
class Manusia
{
public:
virtual void info() = 0;

Laboratorium Komputer TI FT UIKA Bogor

// pure virtual function

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.

Laboratorium Komputer TI FT UIKA Bogor

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.

Laboratorium Komputer TI FT UIKA Bogor

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 = )

tidak dapat dilakukan menurut keadaan bawaan (default).


Menggunakan overloading terhadap operator, dua operasi di atas dapat dilakukan
dengan mudah.

Overloading Terhadap Operator


Misalnya kita mempunyai kelas Buah dengan obyek buah1, buah2 dan buah3 yang
bertipe Buah. Kita hendak menjumlahkan buah1 dan buah2 dan hasilnya disimpan dalam
buah3 berupa jumlah buah dan harga buah. Untuk itu, kita dapat melakukan overloading
terhadap operator + sehingga pernyataan buah3 = buah1 + buah2 menjadi valid. Caranya
dengan menuliskan sebagai berikut dalam kelas Buah.
class Buah
{
protected:
int jumlah_buah;
float harga_buah;
int total_jumlah;
float total_harga;
public:
Buah operator + (Buah b2)
{
Buah b3;
b3.total_jumlah = jumlah_buah + b2.jumlah_buah;
b3.total_harga = harga_buah + b2.harga_buah;
return(b3);

Laboratorium Komputer TI FT UIKA Bogor

21

}
. . .
}
Tidak semua operator pada C++ dapat di-overload. Kita tidak dapat melakukan
overloading terhadap 5 buah operator pada C++, yaitu: ., .*, ::, ?: dan sizeof.

Latihan

Contoh program di bawah ini memberikan gambaran mengenai overloading terhadap


operator pada C++.
Program 6.1 overload.cpp
// Overloading terhadap operator
#include <iostream.h>
class Buah
{
protected:
int jumlah_buah;
float harga_buah;
int total_jumlah;
float total_harga;
public:
Buah operator + (Buah b2)
{
Buah b3;
b3.total_jumlah = jumlah_buah + b2.jumlah_buah;
b3.total_harga = harga_buah + b2.harga_buah;
return(b3);
}
void info()
{
cout << "Total buah
cout << "Total harga
}

: " << total_jumlah << endl;


: " << total_harga << endl;

};
class Apel: public Buah
{
public:
Apel (int jumlah=0, float harga=0.0)
{
jumlah_buah = jumlah;
harga_buah = harga;
}
void info()

Laboratorium Komputer TI FT UIKA Bogor

22

{
cout << "Jumlah apel
cout << "Harga apel

: " << jumlah_buah << endl;


: " << harga_buah << endl;

}
};
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

Laboratorium Komputer TI FT UIKA Bogor

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.

Laboratorium Komputer TI FT UIKA Bogor

24

Latihan

Program di bawah ini memberikan gambaran mengenai sifat polimorfisme pada


fungsi anggota sebuah kelas.
Program 7.1 poly.cpp
// Polymorphisme
#include <iostream.h>
class NasiGoreng
{
public:
NasiGoreng()
{
cout << "Nasi digoreng.. jadi Nasi Goreng." << endl;
cout << "Ditaro di piring. Ambil sendok." << endl;
}
~NasiGoreng()
{
cout << "Nasi gorengnya abis..." << endl;
}
};
class Pisang
{
public:
Pisang()
{
cout << "Pisang dipetik." << endl;
cout << "Dikupas dulu kulitnya." << endl;
}
~Pisang()
{
cout << "Pisangnya abis..." << endl;
}
};
class Manusia
{
public:
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;
}
};

Laboratorium Komputer TI FT UIKA Bogor

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...

Laboratorium Komputer TI FT UIKA Bogor

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.

Fungsi Friend dan Kelas Friend


Untuk menjadikan sebuah fungsi atau kelas menjadi friend bagi kelas lain, caranya
mudah. Misalnya ada sebuah kelas A, fungsi B dan kelas C. Kelas A ingin agar fungsi B dan
kelas C menjadi friend baginya. Cukup tambahkan kata-kata friend di depan deklarasi fungsi
B dan kelas C yang ditempatkan pada bagian public kelas A. Dengan cara ini, fungsi B dan
kelas C dapat mengakses anggota data pada bagian private, protected dan public pada kelas
A.
class A
{
public:
. . .

Laboratorium Komputer Ilkom Unpak Bogor

27

friend void B();


friend class C;
};

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;

Laboratorium Komputer TI FT UIKA Bogor

28

tertua = LebihTua(mimin, kokom);


tertua = LebihTua(tertua, siti);
tertua.info();
}
Manusia LebihTua (Manusia m1, Manusia m2)
{
Manusia m;
m = (m1.umur >= m2.umur) ? m1 : m2;
return (m);
}
Hasil output:
Nama : Mimin
Umur : 32
Nama : Kokom
Umur : 34
Nama : Siti
Umur : 29
Yang tertua di antara mereka adalah...
Nama : Kokom
Umur : 34

Laboratorium Komputer TI FT UIKA Bogor

29

DAFTAR PUSTAKA

Scott Robert Ladd, C++ Components and Algorithms, M&T Publishing,


Inc., 1992.
Dave Mark, Learn C++ on PC, Addison-Wesley, 1993.
Abdul Kadir, Pemrograman C++, Andi Offset, 1995.

Laboratorium Komputer TI FT UIKA Bogor

30

Anda mungkin juga menyukai