Anda di halaman 1dari 9

MODUL 7 OPERATOR BERLEBIHAN BEBAN 1. Setelah 2.

2. Tujuan menyelesaikan modul ini mahasiswa diharapkan: Memahami konsep operator berlebihan beban (operator overloading) Memahami bagaimana C++ menentukan operasi mana yang diinginkan Mengenal bagaimana melebihkan beban unary dan binary operator Memahami cara penggunaan operator berlebihan beban

Pendahuluan Ketika membentuk kelas, kita dapat membentuk jenis data (data type) sendiri o Jenis data menentukan sebuah himpunan nilai yang dapat disimpan data itu beserta sebuah himpunan operasi yang dapat dilakukan program pada data tersebut . o Contoh: int dapat menyimpan bilangan dalam range -32768 hingga 32767 Program dapat melakukan operasi-operasi penjumlahan, pengurangan, perkalian, pem bagian, dan beberapa operasi bitwise pada variabel. Ketika membentuk kelas, adakalanya sangat berguna sekali menyatakan operasi-oper asi tertentu menggunakan operator. o Contoh: Kelas Tanggal menyimpan hari, bulan dan tahun Untuk menambah 30 hari ke tanggal atau mengurangkan 15 hari dari tanggal, tentu akan mudah dipahami apabila dinyatakan dengan operator + atau tgl_tagihan = tgl_pesan + 30; pemberitahuan_1 = tgl_tagihan 15; Ingat bahwa anggota variabel class Tanggal terdiri dari hari, bulan, dan tahun. Agar operator + atau dapat digunakan, program harus mendefinisikan operasi yang harus dilakukan apabila menemukan operator-operator ini pada kelas Tanggal. Program akan melaksanakan sekumpulan operasi (mis. + atau -) ketika menemukan op erator yang digunakan pada jenis data int, float, dll dan sekumpulan operasi lai n apabila menemukan operator yang digunakan pada variabel kelas Tanggal. Operator overloading adalah proses penugasan dua atau lebih operasi ke operator yang sama. Tergantung pada bagaimana operator digunakan, kompiler akan menentukan operasi m ana yang akan dilakukan. Untuk melakukan operator berlebihan beban digunakan kata kunci operator.

3. a)

Overloading Unary Operator Unary Operator Tanpa Argumen

Tuliskanlah program berikut dan perhatikan bagimana penggunaan kata kunci operat or yang digunakan untuk melebihkan beban unary operator ++ //Contoh1.cpp #include <iostream.h> class Hitung { private: unsigned int cacah; public: Hitung() { cacah = 0; }; int get_Hitungan() { return cacah; } void operator ++ () { cacah++; } ~Hitung() { }

}; int main() { Hitung c1, c2; cout << "\nc1 = " << c1.get_Hitungan(); cout << "\nc2 = " << c2.get_Hitungan(); c1++; ++c2; ++c2; cout << "\nc1 = " << c1.get_Hitungan(); cout << "\nc2 = " << c2.get_Hitungan(); cout << endl; return 0; } Apabila program di atas di kompilasi, compiler akan memberikan pesan berikut: no postfix form of 'operator ++' found for type 'Hitung' Abaikan dahulu peringatan tersebut

b)

Unary Operator Dengan Argumen Perhatikan bagaimana operator berlebihan beban ++ menerima sebuah argument berj enis class Hitung dan mengembalikan nilai dari kelas yang sama. //Contoh2.cpp #include <iostream.h> class Hitung { private: unsigned int cacah; public: Hitung() { cacah = 0; }; int get_Hitungan() { return cacah; } Hitung operator ++ () { cacah++; Hitung temp; temp.cacah = cacah; return temp; } ~Hitung() { } }; int main() { Hitung c1, c2; cout << "\nc1 = " << c1.get_Hitungan(); cout << "\nc2 = " << c2.get_Hitungan(); c1++;

c2 = c1++; cout << "\nc1 = " << c1.get_Hitungan(); cout << "\nc2 = " << c2++.get_Hitungan(); cout << endl; return 0; } c) Objek Sementara Tanpa Nama

Pada program Contoh2.cpp terdapat sebuah object bernama temp yang bersifat semen etara berjenis Hitung yang tujuannya untuk memberikan nilai yang dikembalikan un tuk operator ++. Pada contoh program berikut, objek sementara itu dapat dihilangkan sehingga dapa t menghemat kode program. //Contoh3.cpp #include <iostream.h> class Hitung { protected: unsigned int cacah; public: Hitung() { cacah = 0; }; Hitung(int c) { cacah = c; }; int get_Hitungan() { return cacah; } Hitung operator ++ () { cacah++; return Hitung(cacah); } ~Hitung() { } }; int main() { Hitung c1, c2; cout << "\nc1 = " << c1.get_Hitungan(); cout << "\nc2 = " << c2.get_Hitungan(); c1++; c2 = c1++; cout << "\nc1 = " << c1.get_Hitungan(); cout << "\nc2 = " << c2++.get_Hitungan(); cout << endl; return 0; } d) Postfix dan Prefix Unary Increment Operator Untuk mengatasi peringatan yang terdapat pada program contoh1.cpp dan contoh2.cp p, pada program berikut diperlihatkan bagaimana mendefinisikan operator postfix dan prefix inkremen. //Contoh4.cpp #include <iostream.h> class Hitung

{ private: unsigned int cacah; public: Hitung() { cacah = 0; }; int get_Hitungan() { return cacah; } void operator ++ () {cacah++;} // postfix ++cacah void operator ++ (int) {++cacah;} // prefix cacah++ ~Hitung() { } }; int main() { Hitung c1, c2; cout << "\nc1 = " << c1.get_Hitungan(); cout << "\nc2 = " << c2.get_Hitungan(); c1++; c2++; ++c2; cout << "\nc1 = " << c1.get_Hitungan(); cout << "\nc2 = " << c2.get_Hitungan(); cout << endl; return 0; } 4. a) Overloading Binary Operator Operator Aritmatika

Berikut ini diperlihatkan bagaimana binary operator + dilebihkan beban untuk men jumlahkan class berjenis Jarak. //Contoh5.cpp #include <iostream.h> class Jarak { private: int feet; float inches; public: Jarak() { feet = 0; inches = 0.0; }; Jarak(int ft, float in) { feet = ft; inches = in; }; void get_Jarak(); void show_Jarak() { cout << feet << "\'-" << inches << '\"'; } Jarak operator + (Jarak); ~Jarak() { } }; void Jarak::get_Jarak() { cout << "\nBerikan feet: "; cin >> feet; cout << "\nBerikan inches: "; cin >> inches; }

Jarak Jarak::operator + (Jarak j) { int f = feet + j.feet; float i = inches + j.inches; if (i >= 12.0) { i -= 12.0; f++; } return Jarak(f, i); } int main() { Jarak j1, j3, j4; j1.get_Jarak(); Jarak j2(11, 6.25); j3 = j1 + j2; j4 = j1 + j2 + j3; cout cout cout cout cout } b) t: Menambahkan Koordinat Polar Representasi koordinat rectangular dan koordinat polar. Perhatikan gambar beriku << << << << << "\nJarak "\nJarak "\nJarak "\nJarak endl; 1 2 3 4 = = = = "; "; "; "; j1.show_Jarak(); j2.show_Jarak(); j3.show_Jarak(); j4.show_Jarak();

return 0;

Untuk menjumlahkan dua buah koordinat polar, perhatikan gambar berikut:

Agar penjumlahan tersebut dapat dilakukan dengan lebih mudah, penjumlahan dapat dilakukan dalam koordinat rectangular, dengan terlebih dahulu mengkonversi koord inat polar itu menjadi koordinat rectangular sebagai berikut:

Dengan menggunakan rumus konersi berikut: Rectangular ke Polar: X = r cos(a) Y = r sin(a) Polar ke Rectangular: a = atan(x/y)

Contoh program berikut memperlihatkan bagaimana proses penjumlahan yang rumit te rsebut dapat disederhanakan penggunaannya melalui operator overloading. //Contoh6.cpp #include <iostream.h> #include <math.h> class Polar { private: double jari2; double sudut; double getx() { return jari2*cos(sudut); } double gety() { return jari2*sin(sudut); } public: Polar() { jari2 = 0.0; sudut = 0.0; }; Polar(double r, double a) { jari2 = r; sudut = a; }; void display() { cout << "(" << jari2 << ", " << sudut << ")"; } Polar operator + (Polar); ~Polar() { } }; Polar Polar::operator + (Polar p2) { double x = getx() + p2.getx(); double y = gety() + p2.gety(); double r = sqrt(x*x + y*y); double a = atan(x/y); return Polar(r, a); } int main() { Polar p1(10.0, 0.0); Polar p2(10.0, 1.570796325); Polar p3; p3 = p1 + p2; cout cout cout cout } c) Menyambung String << << << << "\np1 = "; p1.display(); "\np2 = "; p2.display(); "\np3 = "; p3.display(); endl;

return 0;

C/C++ tidak membenarkan kita untuk menyambung dua buah string menggunakan operat or +. Untuk maksud ini, C/C++ menyediakan fungsi-fungsi untuk melakukan operasi pada string seperti strcpy() untuk menyalin string, strrcat() untuk menyambung ( concatenate) dua buah string, dan strcmp() untuk membandingkan string. Untuk memudahkan operasi penyambungan string, berikut ini diperlihatkan bagaiman a operaor + dapat dilebihkan beban untuk melaksanakan tugas tersebut.

//Contoh7.cpp #include <iostream.h> #include <string.h> const int SZ = 80; class String { private: char str[SZ]; public: String() { strcpy(str, ""); } String(char s[]) { strcpy(str, s); } void display() { cout << str; } String operator + (String); ~String() { } }; String String::operator + (String ss) { String temp; if (strlen(str) + strlen(ss.str) < SZ) { strcpy(temp.str, str); strcat(temp.str, ss.str); } else cout <<"\nString overflow"; return temp; } int main() { String s1 = "\nFMIPA USU "; String s2 = "Medan, Sumatera Utara"; String s3; s1.display(); s2.display(); s3.display(); s3 = s1 + s2; s3.display(); cout << endl; return 0; }

d)

Operator Perbandingan Selain operator aritmatika, operator lain seperti operator relasional juga dapat

dilebihkan beban. Pada contoh berikut diperlihatkan bagaimana operator < dapat dilebihkan beban un tuk membandingkan dua buah objek berjenis Jarak //Contoh8.cpp #include <iostream.h> enum boolean {salah, benar}; class Jarak { private: int feet; float inches; public: Jarak() { feet = 0; inches = 0.0; }; Jarak(int ft, float in) { feet = ft; inches = in; }; void get_Jarak(); void show_Jarak() { cout << feet << "\'-" << inches << '\"'; } boolean operator < (Jarak); ~Jarak() { } }; void Jarak::get_Jarak() { cout << "\nBerikan feet: "; cin >> feet; cout << "\nBerikan inches: "; cin >> inches; } boolean Jarak::operator < (Jarak j) { float f1 = feet + inches/12.0F; float f2 = j.feet + j.inches/12.0F; return (f1 < f2) ? benar : salah; } int main() { Jarak j1; j1.get_Jarak(); Jarak j2(6, 2.5F); cout << "\nJarak 1 = "; j1.show_Jarak(); cout << "\nJarak 2 = "; j2.show_Jarak(); if (j1 < j2) cout << "\nJarak 1 < Jarak 2"; else cout << "\nJarak 1 > Jarak 2"; cout << endl; return 0; } Perhatikan pula bagaimana operator == digunakan untuk membandingkan dua buah str

ing. //Contoh9.cpp #include <iostream.h> #include <string.h> const int SZ = 80; enum boolean {salah, benar}; class String { private: char str[SZ]; public: String() { strcpy(str, ""); } String(char s[]) { strcpy(str, s); } void getstr() { cin.get(str, SZ); } void display() { cout << str; } boolean operator == (String); ~String() { } }; boolean String::operator == (String ss) { return (strcmp(str, ss.str) == 0) ? benar : salah; } int main() { String s1 = "ya"; String s2 = "tidak"; String s3; cout << "\nJawab dengan 'ya' atau 'tidak: "; s3.getstr(); if (s3 == s1) cout << "Jawaban Anda ya\n"; else if (s3 == s2) cout << "Jawaban Anda tidak\n"; else cout << "Anda tidak mematuhi instruksi yang diberikan\n"; return 0; } 5. Latihan Pemrograman

a) Tambahkanlah operator berlebihan beban (minus) pada class Jarak pada con toh5.cpp, sehingga dimungkinkan untuk menyatakan ekspresi pengurangan berikut: j rk3 = jrk1 jrk2; Asumsikan bahwa operator tersebut tidak pernah digunakan untuk mengurangkan bilangan jang lebih besar dari bilangan yang lebih kecil (yakni, ti dak diperbolehkan jarak negative). b) Buatlah sebuah program untuk melebihkan beban operator penjumlahan aritm atika += sehingga dapat dilakukan operasi berikut: s1 += s2; dimana s2 ditambahk an ke s1 dan hasilnya disimpan di s1. Operator tersbebut juga harus dapat melaku kan operasi seperti berikut: s3 = s1 += s2;

Anda mungkin juga menyukai