BAB 14 OPERATOR OVERLOADING

Ukuran: px
Mulai penontonan dengan halaman:

Download "BAB 14 OPERATOR OVERLOADING"

Transkripsi

1 BAB 14 OPERATOR OVERLOADING 14.1 Pendahuluan Seperti halnya pada fungsi, C++ juga mengizinkan kita untuk melakukan overload terhadap operator. Ini berarti bahwa operator tersebut dapat kita gunakan sesuai kebutuhan yang kita inginkan sendiri. Sebagai contoh, C++ sendiri sebenarnya telah melakukan overload terhadap operator +, sehingga operator ini dapat berlaku untuk menjumlahkan nilai yang bertipe bilangan bulat (seperti int dan long) maupun floating-point (seperti float dan double). Pada bagian ini kita akan mempelajari bagaimana konsep dasar untuk membuat suatu operator dapat bekerja sesuai yang kita harapkan. Konsep dasar yang harus dimiliki untuk dapat melakukan overload terhadap operator adalah dengan mendefinisikan suatu fungsi, yaitu yang dikenal dengan sebutan fungsi operator. Untuk membuat fungsi ini digunakan kata kunci operator. Fungsi operator kebanyakan berperan sebagai anggota (member function) dari suatu kelas. Kalaupun tidak, maka fungsi tersebut biasanya merupakan suatu friend function. Terdapat perbedaan antara penulisan fungsi untuk pembuatan fungsi operator yang merupakan anggota kelas dan yang bukan. Berikut ini bentuk umum pembuatan fungsi operator yang merupakan anggota dari suatu kelas. Bab 14: Operator Overloading

2 tipe_kembalian namajkelaa s t operator* (daftar_jparameter) // Operas! yang akan dilakukan Pada bentuk umum di atas, nama_kelas adalah nama dari kelas pemilik fungsi tersebut. Sedangkan tanda # di atas berfungsi sebagai placeholder, artinya di sinilah kita mendefinisikan operator apa yang akan kita overload. Apabila kita ingin melakukan overload terhadap operator +, maka penulisan fungsinya adalah operator*. Begitu pula jika kita akan melakukan overload terhadap operator /, maka kita akan menulisnya operator/. Sedangkan bentuk umum dari pembuatan fungsi yang bukan merupakan anggota kelas (yang bias any a adalah friend function) adalah sama seperti pendefinisian fungsi biasa, yaitu sebagai berikut : tlpejmunbalian operator* (daf tar parameter) // Operas! yang akan dilakukan 14.2 Operator yang Tidak Dapat D\-Overload Meskipun C++ telah memberikan kebebasan kepada kita untuk melakukan overload, namun ada beberapa operator yang tidak diizinkan untuk di-overload. Berikut ini operator-operator yang dimaksud di atas. :, r *:.VffeeV;'- --.' Selain itu kita juga tidak diizinkan untuk melakukan overload terhadap simbol preprocessor, yaitu # dan ##. Untuk lebih jelasnya, berikut ini operator-operator yang dapat kita overload. a. Operator Unary + - * & ~ b. Operator Binary + -*/%-& > ->* new[] delete delete [] 14.3 Melakukan Overload terhadap Operator Binary Pada bagian ini kita akan membahas mengenai overload terhadap operator binary, sedangkan operator unary akan dibahas pada sub bab selanjutnya di dalam buku ini. Hal ini dimaksudkan agar Anda dapat lebih memahami konsepnya terlebih dahulu. Adapun operator binary yang akan di-over/oad di sini hanyalah tiga, yaitu operator +, - dan =. Ini disebabkan karena Anda tentu sudah familiar dengan penggunaan operator-operator tersebut. Untuk lebih lengkapnya, diharapkan Anda dapat mengembangkannya sendiri dengan berbekal konsep-konsep yang telah di dapat pada bab ini. Berikut ini penjelasan mengenai cara-cara melakukan overload terhadap operator-operator yang dimaksud di atas Overload Operator + Di sini kita akan membuat program yang di dalamnya terdapat overload operator plus (+) sehingga operator tersebut dapat menjumlahkan dua buah nilai yang bertipe objek. Fokuskan perhatian Anda ke pembuatan fungsi operator di bawah ini. Adapun sintaks programnya adalah sebagai berikut. // Membuat kelas TITIK class TITIK { int X, Y; public: // Membuat fungsi constructor untuk kelas TITIK TITIK(int XX, int YY) { X = XX; Y = YY; // Membuat fungsi ShowXY void ShowXY() { cout«"nilai X : "«X«endl; cout«"nilai Y : "«Y«endl; // Mendeklarasikan fungsi operator yang mengembalikan Bab 14: Operator Overloading

3 / objek TITIK TITIK TITIK::operator +(TITIK P) ; // Implementasi dari fungsi operator di atas TITIK TITIK::operator +{TITIK P) {.return TITIK(P.X + X, P.Y + Y); // Fungsi utama // Melakukan instansiasi terhadap kelas TITIK TITIK A(2, 3); TITIK B(5, 4); // Menampilkan nilai X dan Y yang terdapat pada objek A dan A.ShowXYO ; cout«endl ; B.ShowXY(}; cout«endl ; // Menjumlahkan objek A dan B dan menyimpannya ke objek TITIK C = A + B; // Menampilkan nilai X dan Y yang terdapat pada objek C C.ShowXY(); return ; Hasil yang akan diberikan dari program di atas adalah sebagai Nilai X : 2 Nilai Y : 3 Nilai X : 5 Nilai Y : 4 Nilai X : 7 Nilai Y: 7 Seperti yang kita lihat di atas bahwa operator + dapat kita gunakan untuk menjumlahkan dua buah objek bertipe TITIK. Secara default, operasi ini tentu tidak diperbolehkan oleh kompiler. Namun dengan melakukan overload terhadap operator tersebut, maka kita dapat melakukannya Overload Operator - Untuk melakukan overload terhadap operator -- tentu prinsipnya sama dengan overload terhadap operator + di atas. Namun, sebagai pengetahuan bagi Anda, kita akan melakukan modifikasi terhadap program di atas dengan menambahkan fungsi operator untuk operator -. Adapun sintaks programnya adalah sebagai #include <iostream> class TITIK.{ int X, Y; public: // Membuat fungsi SetXY dan ShowXY void SetXY (int XX, int YY) { X = XX; Y = YY; void ShowXY () { cout«"nilai X cout«"nilai Y «X«endl; «Y«endl; // Mendeklarasikan fungsi operator untuk TITIK TITIK: : operator -(TITIK P) ; // Implementasi dari fungsi operator di atas TITIK TITIK::operator -(TITIK P) { TITIK temp; // Membuat objek temporary yang bertipe temp.x = X - P.X; tertp.y = Y - P.Y; return temp; // Fungsi utama nt main() { // MelaJcu/can instansiasi terhadap kelas TITIK TITIK A, B, C; // Mengeset nilai X dan Y untuk objek A dan B Bab 14: Operator Overloading

4 usetxy(1, 6);.SetXY(4,2) ; // Menampilkan nilai X dan Y yang terdapat pada objek A \, ShowXY ( ) ; :out«endl ; // Menampilkan nilai X dan Y yang terdapat pada objek A B. ShowXY ( ) ; cout«endi ; // Melakukan pengurangan terhadap objek A dan B C = A - B; // Menampilkan nilai X dan Y yang terdapat pada objek C C. ShowXY ( ) ;:: return ; Apabila dijalankan program di atas akan memberikan hasil sebagai berikut : Nilai X : 1 Nilai Y : 6 Nilai X : 4 Nilai Y : 2 Nilai X: 6 Nilai Y : Overload Operator = Pada bagian ini kita akan melakukan overload terhadap operator =. Sebelumnya kita telah mengetahui bahwa operator = digunakan untuk melakukan assigment suatu nilai ke dalam suatu variabel. Namun di sini, kita akan menjadikan operator tersebut bekerja untuk assignment nilai ke dalam sebuah objek. Prinsip kerjanya sama dengan layaknya fungsi yang digunakan untuk pengesetan nilai (misalnya SetX ()). Untuk lebih memahaminya, perhatikan dahulu program di bawah ini, dimana nilai diset melalui fungsi. Adapun sintaksnya adalah sebagai Pemrograman C+^ Mncl.ude <iostream> class CONTOH { int X; public: t void SetX(int XX) { X = XX; int GetXO { return X; // Fungsi utama Kode Program 14-3 // Melakukan instansiasi terhadap kelas CONTOH CONTOH A; :,// Memasukkan nilai 5 ke variabel X yang terdapat // pada kelas CONTOH A.SetX(5); // Menampilkan nilai X cout«"nilai X : M «A.GetX(); return Seperti yang kita lihat di atas bahwa untuk memasukkan nilai ke dalam variabel X yang terdapat pada objek A, kita menggunakan fungsi SetX (). Di sini kita tidak dapat melakukannya dengan menggunakan operator =, yaitu dengan statemen : A = 5; // SALAH, tidak diizinkanoleh kompiler : : ; Namun, untuk mengatasi kasus seperti ini, sebenarnya kita dapat melakukan overload terhadap operator =. Berikut ini contoh program yang akan menunjukkan hal tersebut. " ^^^^^^^ fmmmmmmiimmmfmmmammmm #include <iostream> class CONTOH { Bab 14: Operator Overloading

5 int X; public: int GetXf return X; // Membuat fungsi operat fint operator =(int nila^.{ X = nilai; return 1; // return true // Fungsi utama // Melakukan instansiasi terhadap kelas CONTOH CONTOH A; // Memasukkan nilai 5 ke variabel X yang terdapat // pada kelas CONTOH A» 5; // Sebenarnya memanggil A.operator"(5) // Menampilkan nilai X cout«"nilai X : "«A.GetX( return ; 86/"?«v- Apabila kedua program di atas dijalankan, maka akan memberikan hasil yang sama, yaitu sebagai Nilai X : Melakukan Overload terhadap Operator Unary Selain operator binary, kita juga dapat melakukan overload terhadap operator-operator unary. Adapun contoh yang akan kita bahas di sini hanya mencakup operator increment (++) dan decrement (--) iaja Overload Operator ++ Secara default, dalam C + + operator increment (++) digunakan untuk menambahkan nilai satu terhadap suatu variabel yang Pemrograman C- bertipe bilangan bulat, bilangan floating-point maupun karakter. Namun di sini, kita akan melakukan overload terhadap operator tersebut sehingga dapat bekerja untuk tipe objek. Adapun kelas yang akan diambil sebagai contoh di sini adalah kelas titik (yang mempunyai data X dan Y). Pada contoh ini, setiap increment objek maka nilai X dan Y dari objek tersebut secara otomatis akan bertambah satu. Berikut ini sintaks program yang menunjukkan hal tersebut. #include <iostream> Kode Program 14-5 class TITIK { int X, Y; public : // Membuat fungsi constructor untuk kelas TITIK TITIK (int XX, int YY) { X = XX; Y = YY; }; // Membuat fungsi ShowXYO void ShowXYO { cout«"nilai X : "«X«endl; cout«"nilai Y : "«Y«endl; // Membuat fungsi operator untuk pre- increment TITIK operator ++ ( ) { X += 1; // dapat dituliskan X = X + 1 Y += 1; // dapat dituliskan Y = Y + 1 return *this;.// Membuat fungsi operator untuk post- increment TITIK operator ++(int) { X += 1; Y += 1; return *this; // Fungsi utama // Mela^uJcai! instansiasi terhadap kelas TITIK A(2, 4); // Melakukan pre-increment terhadap obje. cout«"pre--increment untuk objek A"«end ++A; Bab 14: Operator Overloading

6 . // Menampilkan nilai X dan Y yang terdapat pada objek A A.ShowXYO ; cout«endl ; // Melakukan instansiasi terhadap kelas TITIK TITIK B(1, 5) ; // Melakukan post-increment terhadap objek B cout«"post-increment untuk objek B"«endl; B++; // Menampilkan nilai X dan Y yang terdapat pada objek B B.ShowXY(); i return ; Hasil yang akan diberikan dari program di atas adalah sebagai Pre-increment untuk objek A Nilai X : 3 Nilai Y : 5 Post-increment untuk objek B Nilai X: 11 Nilai Y : Overload Operator - - Masih seputar kelas TITIK, di sini kita akan menjadikan operator decrement (--) dapat bekerja untuk objek yang bertipe TITIK. Sebenarnya prinsip yang terdapat di dalamnya adalah sama saja dengan overload terhadap operator increment (++) di atas. Untuk lebih jelasnya, perhatikan contoh program di bawah ini. // Membuat fungsi constructor untuk kelas TITIK TITIK (int XX, int YY) { X = XX; Y = YY; } #*' // Membuat fungsi ShowXY() void ShowXY() { cout«"nilai X : "«X«endl; cout«"nilai Y : K «Y«endl; // Membuat fungsi operator untuk pre-increment TITIK operator --() { X -= 1; // dapat dituliskan X = X - 1 Y -= 1; // dapat dituliskan Y = Y - 1 return *this; // Membuat fungsi operator untuk post-increment TITIK operator (int) { X -= 1; Y -= 1; return *this; // Fungsi utama // Melakukan instansiasi terhadap kelas TITIK TITIK A(1, 2); -// Melakukan pre-decrement terhadap objek A cout«"pre-decrement untuk objek A"«endl; ;~A; : // Menampilkan nilai X dan Y yang terdapat pada objek A.ShowXYO ; cout«endl ; // Melakukan instansiasi terhadap kelas TITIK "TITIK B(2, 6); // Melakukan post-decrement terhadap objek B cout«"post-decrement untuk objek B"«endl; B--; class TITIKIK { int X, public: // Menampilkan nilai X dan Y yang terdapat pada objek B.ShowXY(); return ; Bab 14: Operator Overloading

7 Hasil yang akan diberikan dari program di atas adalah sebagai Pre-decrement untuk objek A Nilai X: 9 Nilai Y : 19 Post-decrement untuk objek B Nilai X : 1 Nilai Y : Melakukan Overload terhadap Operator Khusus Seperti yang telah dikemukakan sebelumnya, C++ mengizinkan kita untuk melakukan overload terhadap operator-operator khusus selain dari operator binary dan unary. Adapun operator khusus yang akan dibahas sebagai contoh di sini hanyalah operator new dan delete. Hal ini disebabkan karena pada prakteknya dalam kebanyakan program C + + sering sekali ditemui adanya overload terhadap kedua buah operator ini Overload Operator new Dalam C+ +, kita juga dapat melakukan overload terhadap operator new sehingga kita dapat melakukan pengalokasian secara khusus untuk suatu tipe ataupun kelas tertentu. Adapun bentuk umum untuk membuat fungsi operator untuk operator new yang telah ditentukan dalam C++ adalah sebagai void "operator new(slze_t size) { // Statemen untuk menjalankan alokasi memori // Jika alokasi gagal/ lemparkan eksepsi Jbad_alloc return pointer/ 1 Pada bentuk umum di atas, size_t adalah suatu tipe yang telah didefinisikan di dalam C++ (hampir sama dengan tipe unsigned integer). Sebagai contoh di sini kita akan melakukan overload terhadap operator new untuk kelas titik, dimana apabila kita melakukan pengalokasian memori untuk kelas titik tersebut, maka operator new yang akan dipanggil oleh kompiler adalah operator yang telah kita definisikan sendiri, bukan operator new yang telah terdefinisi dalam C + +. Untuk lebih memahaminya, berikut ini sintaks program yang menunjukkan hal tersebut. #include <iostream> #include <cstdlib> #include <new> class TITIK { int X, Y; public: TITIK(int XX, int YY) { X = XX; Y = YY; Kode Program 14-7 void ShowXYO { cout«"nilai X : "«X«endl; cout«"nilai Y : "«Y«endl; // Untuk menggunakan fungsi malice () // Untuk menggunakan eksepsi bad_alloc // Membuat fungsi operator untuk operator new void *operator new(size_t size) { void *P; cout«"operator new yang didefinisikan sendiri"< // Melakukan alokasi memori P = malloc(size); // Jika gagal, lemparkan eksepsi bad_allo if (!P) { ~ bad_alloc BA; throw BA? ). return P; // Fungsi utama // Mendeklarasikan pointer PT yang akan menunjuk tipe TiTlf TITIK '*PT; Bab 14: Operator Overloading

8 '/ Melakukan alokasi dengan operator new ;ry { PT = new TITIK (2, 5) ; // Menampilkan nilai X dan Y PT->ShowXY() ; } catch (bad_alloc E) { cout«"alokasi untuk PT gagal "«endl; return 1; // Mendealokasikan memori delete PT; // Mendeklarasikan pointer yang akan menunjuk ke tipe int int *PI; PI = new int; *PI = 3; cout«"\nnilai *PI : "«*Pl«endl; return ; Hasil yang akan diberikan dari program di atas adalah sebagai berikut : Operator new yang didefinisikan sendiri Nilai X : 2 Nilai Y : 5 Nilai *PI : 3 Seperti yang kita lihat di atas bahwa pada saat kita mengalokasikan tipe TITIK, maka yang akan dipanggil adalah operator new yang kita definisikan sendiri. Namun pada saat kita mengalokasikan tipe int, operator new yang digunakan adalah operator new asli yang terdapat pada C + +. Sebagai bukti, di saat ki.a mengalokasikan tipe int, kita tidak melihat adanya teks "Operator new yang didefinisikan sendiri". Untuk operator delete di atas juga menggunakan operator yang telah terdefinisi secara default dalam C + +. Walaupun demikian, kita juga dapat melakukan overload terhadap operator delete seperti yang akan dibahas pada sub bab di bawah ini Overload Operator delete Pada bagian ini kita akan membahas overload untuk operator delete melalui sebuah contoh program. Namun sebelumnya kita harus mengetahui terlebih dahulu bentuk umum untuk pembuatan fungsi operator untuk operator delete, yaitu seperti yang tampak di bawah ini. void operator delete (void *p) { // Mendealokasikan memori yang ditunjuk oleh pointer p Adapun program yang akan dituliskan di bawah ini merupakan modifikasi dari program di atas. Di sini, kita akan melakukan overload terhadap operator delete sehingga dapat digunakan secara khusus untuk kelas TITIK. Berikut ini sintaks program yang dimaksud. Kode Program 14-8 tinclude <iostream> #include <cstdlib> // Untuk menggunakan fungsi malloco // dan freeo #include <new> // Untuk menggunakan eksepsi bad_alloc class TITIK { int X, Y; public : TITIK (int XX, int YY) { X = XX; Y = YY; void ShowXYO { cout«"nilai X cout«"nilai Y I "«X«endl; "«Y«endl; // Membuat fungsi operator untuk operator new void *operator new(size_t size) { void *P; cout«"perator new yang didefinisikan sendiri"«end^ // Melakukan alokasi memori P - malloc(size); // Jika gagal, lemparkan eksepsi bad_alloc if (!P) { bad_alloc BA; throw BA; Bab 14: Operator Overloading

9 }; return P; // Membuat fungsi operator untuk operator delete void operator delete(void *P) { cout«"operator delete yang didefinisikan sendiri"«endl; free(p); // Fungsi utama int main(} { Berbeda dengan program sebelumnya, operator delete yang digunakan di sini adalah operator delete yang khusus kita definisikan sendiri untuk kelas TITIK. Sebagai bukti pernyataan ini, pada saat kita menggunakan operator delete terhadap pointer yang menunjuk ke kelas TITIK, maka di layar akan ditampilkan teks"operator delete yang didefinisikan sendiri". Sedangkan untuk penghapusan pointer PI yang menunjuk ke tipe int, operator delete yang digunakan masihlah operator asli yang terdapat pada C+ +. // Mendeklarasikan pointer PT yang akan menunjuk tipe TITIK TITIK *PT; // Melakukan alokasi dengan operator new try { PT = new TITIK(2, 5); // Menampilkan nilai X dan Y PT->ShowXY(); catch (bad_alloc E) { cout«" Alokasi untuk PT gagal"«endl; return 1; // Mendealokasikan memori delete PT; // Mendeklarasikan pointer yang akan menunjuk ke tipe in int *PI; PI = new int; *PI = 3; cout«"\nnilai *PI : "«*pi«endl; return ; Hasil yang akan diberikan dari program di atas adalah sebagai Operator new yang didefinisikan sendiri Nilai X : 2 Nilai Y: 5 Operator delete yang didefinisikan sendiri Nilai *PI: 3 Bab 14: Operator Overloading

10 BAB 15 PREPROCESSOR DIRECTIVE 15.1 Pendahuluan Dalam C+ +, kita dapat memasukkan berbagai macam perintah ke kompiler melalui preprocessor directive, yaitu perintah yang diawali dengan tanda pound (#). Meskipun perintah ini biasanya terdapat pada bagian awal program, namun sebenarnya kita dapat memasukkannya dimanapun (di dalam kode program) sesuai kebutuhan dari program yang akan kita buat. Perlu diperhatikan bahwa sebuah perintah yang menggunakan preprocessor directive harus diletakkan dalam satu baris tersendiri. Adapun beberapa directive yang terdapat dalam C++ adalah sebagai #include #if ttifdef #define #pragma #error #elif #else #endif #ifndef #undef #line Bab 15: Prepocessor Directive

11 15.2 Directive # include Directive #include digunakan untuk memasukkan file header ke dalam kode program yang kita tuliskan. Hal ini selalu kita lakukan pada setiap program C + +. Adapun caranya adalah dengan menuliskan file header yang akan dimasukkan setelah directive #include. Sebagai contoh, jika kita akan memasukkan file header <iostream> dan <cstdlib>, maka kita akan menuliskannya seperti berikut. #include <iostream> HIMHjjjjHHlHHEi Jika kita telusuri lebih jauh, perintah di atas sebenarnya berfungsi untuk memasukkan kode-kode yang terdapat kedua file header tersebut ke dalam kode program kita. Artinya, sebelum mengeksekusi kode program, kompiler akan melakukan perintahperintah yang terdapat pada preprocessor directive terlebih dahulu Directive ttdef ine Kita dapat mendefinisikan sebuah makro identifier ke dalam sebuah program melalui directive #def ine. Prinsip dasar dari cara kerja #define ini adalah menggantikan makro identifier tersebut dengan sebuah nilai yang kita definisikan di belakangnya. Sebagai contoh, kita ingin mendefinisikan sebuah makro identifier dengan nama TEST yang dikuti dengan nilai 1, maka kita akan menuliskannya seperti berikut. _^^^^_^^^^^^ tdefine TEST 1 Perintah tersebut menyebabkan setiap terdapat string TEST di dalam kode program, maka string tersebut akan digantikan oleh 1. String yang dimaksud di sini tentunya bukanlah sebuah tipe data yang terdapat dalam C+ +. Berikut ini contoh implementasinya di dalam sebuah program. ttinclude <iostream> Kode Program 15-1 // berarti hasil = (1 * 1) + 1 int hasil = (TEST * TEST) + TEST; :;::COUt«"Hasilnya : "«hasil; return ; Hasil yang akan diberikan dari program di atas adalah sebagai Hasilnya : 11 Untuk dapat lebih membuktikan pernyataan di atas, perhatikan kembali contoh program di bawah ini. ttinclude <iostream> tdef ine TEKS int main ( ) { COUt«TEKS; return ; Kode Program 15-2 "Saya sangat menyukai C++" Pada program di atas perintah string TEKS akan digantikan oleh string "Saya sangat menyukai C++". Adapun hasil yang akan diberikan dari program di atas adalah sebagai berikut : Saya sangat menyukai C+ + Karena alasan inilah directive ttdefine juga sering digunakan dalam pendefinisian sebuah konstanta. Walaupun demikian, untuk mendefinisikan sebuah konstanta dalam C++ sebaiknya kita tetap menggunakan kata kunci const. #define-test 1 Bab 15: Prepocessor Directive

12 15.4 Membuat Makro Fungsi dengan Directive ttdefine Makro fungsi sebenarnya sama dengan sebuah fungsi bias a, hanya saja sebuah makro fungsi hanya terdiri dari satu baris perintah dan cara kerjanya sama dengan sebuah fungsi inline, yaitu melakukan penyalinan perintah yang terdapat pada baris tersebut ke dalam baris tertentu di dalam kode program. Pada bagian ini kita akan membahas pembuatan makro fungsi dengan menggunakan directive #define. Adapun contoh pendefinisiannya adalah seperti di bawah ini. #define F(x) ((x*x) + (2*x) + 1) #define ABS(y) (y)<? -(y) : (y) Berikut ini contoh program yang menunjukkan hal tersebut. #include <iostream> Kode Program 15-3 '/ Mendefinisikan fungsi F(x) = x 2 + 2x + 1 ^define F(x) ((x*x) + (2*x) + I) V Mendefinisikan fungsi untuk menentukan harga mutlak / dari sebuah bilangan ^define ABS(y) (y)<? -(y) : (y) ising namespace std; // Mendeklarasikan variabel a dan b yang bertipe int int a = 1, b = 5; // Mendeklarasikan variabel c yang bertipe double double c = -4,56; // Memanggil fungsi makro dan menampilkan hasilnya ke layar cout«"f("«a«") : "«F (a) «endl; cout«"abs ( "«b«") : U «ABS (b) «endl ; cout«"abs("«c«") : "«ABS(c)«endl; return ; Mr.,.. ' Hasil yang akan diberikan dari program di atas adalah sebagai F(1) ABS(5) ABS(-4.56) Penting sekali untuk diperhatikan bahwa dalam penulisan sebuah makro fungsi, kita harus selalu menuliskan tanda kurung yang sesuai. Jika kita tidak (atau salah) menggunakan tanda kurung, maka hasil yang diperoleh dari makro fungsi tersebut juga akan salah. Sebagai contoh, berikut ini program yang menunjukkan pembuatan makro fungsi yang tidak menggunakan tanda kurung. tinclude <iostream> Kode Program 15-4 // Mendefinisikan fungsi untuk menghitung x tdefine F(x) x * x * x cout«f(5) ; return ; Hasil yang diberikan dari program di atas adalah sebagai berikut 125 Apa yang Anda lihat? Hasil yang diperoleh di atas memang masih benar, namun bagaimana jika pemanggilan fungsinya menggunakan sintaks berikut. F (2+3) 4BBBB Jika kita melakukan pemanggilan dengan cara seperti ini, m< kompiler akan menerjemahkannya seperti berikut. 2+3 * 2+3 * 2+3, : ; ' ; ' ;,,., : :_...^..^.'^ Karena operator * (perkalian) lebih tinggi tingkatannya dibandingkan operator + (penjumlahan), maka hasil perhitungan di atas adalah Bab 15: Prepocessor Directive

13 Sehingga hasil akhir dari makro fungsi tersebut bukanlah 125, melainkan 17. Hal ini jelas salah dan tidak sesuai dengan apa yang kita harapkan. Untuk menghindari hal tersebut kita seharusnya menuliskan program di atas dengan sintaks seperti di bawah ini. #include <iostream> Kode Program 15-5 // Mendefinisikan fungsi untuk menghitung x 3 #define F(x) (x) * (x) * (x) using namespace std? int main{) { i cout«f(5) ; return ; ^-B^.,,^.,^_ * K l ihhhhrii!hhhhihiihhbhhhhb9^h Dengan menggunakan cara ini, walaupun kita melakukan pemanggilan fungsi dengan F(2+3), nilai yang dihasilkan akan tetap benar karena kompiler akan menerjemahkannya seperti berikut. (2+3) V(2+3) '-*' (2+3) Hal ini sama dengan 5 * 5 * 5 Sehingga nilai yang dihasilkan tetap benar, yaitu 125. Oleh karena itu dalam menuliskan sebuah makro fungsi, Anda harus teliti dan berhati-hati dalam menggunakan tanda kurung. Akan lebih baik lagi jika makro fungsi di atas dituliskan seperti berikut. -:, -; > '^" r Seperti telah dijelaskan sebelumnya bahwa sebuah perintah preprocessor directive hanya ditampung dalam satu baris, namun jika kita ingin menuliskannya dalam dua baris atau lebih maka kita harus menggunakan tanda backslash (\) untuk menggabungkannya. Misalnya jika sebelumnya kita mempunyai perintah seperti berikut. define F(x) ((x*x*x) + (2*x*x) + (x) +-1} define TEKS "String ini terdapat pada makro'"identifier"': Maka kita dapat menuliskannya seperti di bawah ini. #define F(x) ((x*x*x) + \ (2*x*x) + \ #define TEKS "String ini \ terdapat pada makro identifier' 15.5 Pemilihan dengan Menggunakan Directive #if Dalam C+ +, kita dapat melakukan suatu pemilihan dengan menggunakan preprocessor directive, diantaranya dengan menggunakan directive #if. Setiap bentuk pemilihan yang menggunakan preprocessor directive selalu diakhiri dengan directive #endif. Bentuk umum penggunaannya adalah sama seperti pada saat kita melakukan pemilihan dengan struktur if, namun di sini kondisi yang akan diperiksa tidak harus dalam tanda kurung, sedangkan dalam struktur if hal tersebut merupakan suatu keharusan. Berikut ini bentuk umumnya. Untuk satu buah kondisi #if kondisi Statemen yang_akan dilakukazif #endif Berikut ini contoh program yang merupakan implementasi dari pemilihan dengan menggunakan directive #if dengan satu kondisi. #define X 2 using namespace std // Fungsi utama // Melakukan pengecekan #if X > 1 cout«x«" lebih besar dari ;;#endi f return ; Pemrograman Bab 15: Prepocessor Directive

14 Hasil yang akan diberikan dari program di atas adalah sebagai berikut : 2 lebih besar dari 1 Sedangkan untuk dua buah kondisi, kita harus menggunakan directive #else seperti yang terlihat pada bentuk umum di bawah #if kondisi ^^^^^^^^^^^^^^^^^ Stat emen_yangr_akan di 1 akukan_jika_kondi si_ terpenuhi / false Statemaa_yaaff_akan_dilakukan_Jika_kondi8i_tidak_terpen.'uhijr #endif Adapun contoh program yang menerapkan bentuk di atas adalah seperti yang tertulis di bawah ini. Terakhir, apabila kondisi yang akan diperiksa lebih dari dua, maka kita juga harus menggunakan directive #elif sehingga bentuk umumnya menjadi seperti di bawah ini. #if kondisil Statemen. yanff_akan_dilakukan_jika_kondisil_terpenuhi,' #elif kondisi2 Statemen yang_akan_dilakukan_jika_kondisi2_terpenuhi/ #elif kondisin Statemen_yang_akan_dilakukao_jika_koiidi8iN_terpenuhif #else Stat&men_lain_jika_kondi8il_saiapa.i_N_tidak_terpenuhit #endi Berikut ini contoh program yang menunjukkan hal tersebut. #include <iostream> Kode Program 15-8 ttdefine X 1 using // int // #if X #else cout #endif return Hasil yang akan diberikan dari program di atas adalah sebagai 8 lebih kecil dari 1 Seperti yang kita lihat dari hasil di atas, bahwa jika kondisi yang diperiksa tidak terpenuhi, maka program akan mengeksekusi statemen yang terdapat pada bagian directive #else. // Fungsi utama // Melakukan pengecekan #if X > 1 cout«x«" lebih besar dari 1"; felif X = 1 cout«" Nilai yang didefinisikan adalah 1"; ielse cout«x«" lebih kecil dari 1"; tendif return ; Hasil yang akan diberikan dari program di atas adalah sebagai Nilai yang didefinisikan adalah 1 Mula-mula kompiler akan mengecek kondisi yang pertama (X > 1). Oleh karena kondisi tersebut tidak terpenuhi, selanjutnya Bab 15: Prepocessor Directive

15 kompiler melakukan pengecekan terhadap kondisi kedua (X = 1). Karena kondisi ini terpenuhi, maka statemen yang terdapat di dalamnya akan dieksekusi (dalam hal ini yang terdapat pada directive #elif) dan statemen yang terdapat pada directive #else tentu akan diabaikan atau tidak dieksekusi Pemilihan dengan Menggunakan Directive ttifdef Dalam C+ +, apabila kita akan melakukan suatu pengecekan sebuah makro, apakah makro tersebut sudah didefinisikan atau belum, maka kita dapat menggunakan directive #ifdef (yang berarti #if defined). Sama halnya seperti directive #if, #if def juga harus diakhiri oleh directive #endif. Selain itu di sini juga memberlakukan penggunaan #else. Untuk lebih memperjelas hal tersebut, perhatikan program di bawah ini. tinclude <iostream> ttdefine X 2 Kode Program 15-9 // Melakukan pengecekan dengan directive #ifdef #ifdef X cout«"x telah didefinisikan"«endl; #else cout«"x belum didef inisikan"«endl ; #endif return ; luta juga dapat menuliskan program di atas dengan sintaks seperti di bawah ini #include <iostream> #define X 2 Kode Program 15-1 // Melakukan pengecekan dengan #if defined #if defined X cout«"x telah didefinisikan"«endl; #else cout«"x belum didef inisikan"«endl; tendif return ; Kedua program di atas akan menghasilkan keluaran sebagai X telah didefinisikan Sekarang jika terdapat program yang X-nya tidak didefinisikan terlebih dahulu, seperti pada program berikut. #include <isotream> Kode Program // Melakukan pengecekan dengan iifdef #ifdef X cout«"x telah didefinisikan"«endl; #else cout«"x belum didefinisikan"«endl; #endif return ; Hasil yang akan diberikan dari program di atas adalah sebagai X belum didefinisikan Seperti yang kita lihat bahwa pada prinsipnya pemilihan dengan menggunakan directive #ifdef sama saja dengan pemilihan yang menggunakan directive #if, artinya jika kondisi yang diperiksa tidak terpenuhi, maka statemen yang akan dilakukan adalah statemen yang terdapat pada bagian directive #else. Bab 15: Prepocessor Directive

16 Sebenarnya tujuan dari pengecekan dengan directive #ifdef ini adalah untuk mendefinisikan sebuah makro jika makro tersebut belum didefinisikan. Berikut ini contoh yang menunjukkan hal tersebut. #include <iostream> ffifdef x cout«"x telah didefinisikan"«endl #else cout«"mendefinisikan X"«endl; fdefine X 5 ttendif cout«"x = " return > Wm Hasil yang akan diberikan dari program di atas adalah sebagai Mendefinisikan X X = Pemilihan dengan Menggunakan Directive ttifndef Selain menggunakan directive #if dan #ifdef, kita juga dapat melakukan pemilihan dengan directive ttifndef. #ifndef ini merupakan kebalikan dari #ifdef. Berikut ini contoh program yang menunjukkan penggunaan directive #if ndef. lint main () { j ; ' ] #ifndef X // bisa dituliskan dengan #if Idefln j cout«"x belum didef inisikan"«endl ; j #else j cout«"x telah.,d^tefinisikan"«endl; j> #endif I return ;'«ysj Hasil yang akan diberikan dari program di atas adalah sebagai X belum didefinisikan Seperti yang kita lihat bahwa jika makro identifier X belum didefinisikan, maka kondisi yang terdapat pada #ifndef X akan bernilai benar sehingga statemen yang akan dilakukan adalah statemen yang terdapat pada bagian ini, yaitu menampilkan teks "X belum didefinisikan". Berikut ini contoh lain dari penggunaan directive #if ndef di dalam program. tinclude <iostream> Kode Program Mfndef X cout«"x belum didefinisikan"«endl; #define X 32 // Mendefinisikan X cout«"sekarang X telah didef inisikan"«endl; #else cout«"x telah didefinisikan"«endl, #endif cout«"x = "«X«endl; return ; Hasil yang akan diberikan dari program di atas adalah sebagai X belum didefinisikan Sekarang X telah didefinisikan X = 32 Bab 15: Prepocessor Directive

17 15.8 Directive tfunde f Directive #undef berguna untuk menghapus makro yang telah didefinisikan sebelumnya. Ini berguna jika kita ingin melakukan perubahan nilai dari makro tersebut. Directive ini merupakan kebalikan dari directive #define. Berikut ini contoh program yang mengilustrasikan hal tersebut. ttinclude <iostream> ttdefine X 154 Kode Program cout«"sekarang X tidak didefinisikan lagi"«end #else cout«"x masih terdefinisi"«endl; #endif return ; BBMBi Hasil yang akan diberikan dari program di atas adalah sebagai X telah didefinisikan X= 154 Sekarang X tidak didefinisikan lagi cout«x«endl ; ttundef X eout«x«endl ; return // Menghapus definisi makro X // SALAH,karena definisi X sudah ti // ada lag! Sebagai contoh lain, coba Anda perhatikan program di bawah ini. ttinclude <iostream> ttdefine X 154 int main{) { Kode Program ttifdef X, cout«"x telah didefinisikan"«endl; cout«"x = "«X«endl; ttelse cout«"x belum didefinisikan"«endl, ttendif #undef X // Mengapus definisi makro 15.9 Directive #error Directive # err or digunakan untuk menghentikan proses kompilasi dan selanjutnya menampilkan pesan kesalahan. Biasanya, penggunaan directive ini berhubungan dengan directive #if. Adapun bentuk umum dari penggunaannya adalah seperti di bawah ini. #error pesan kesalahan Perlu diperhatikan bahwa pesan_kesalahan di atas tidak perlu diapit oleh tanda kutip dua ("") seperti halnya string yang biasa dituliskan di dalam C+ +. Berikut ini contoh program yang menunjukkan hal tersebut. #include <iostream> ttdefine X -1 #if x == -1 tterror X tidak boleh bernilai negatif ttendif fifndef X Bab 15: Prepocessor Directive

18 Apabila program di atas dijalankan maka akan terjadi error yang ditampilkan oleh kompiler. Adapun pesan dari error tersebut adalah: X tidak boleh bernilai negatif. BAB 16 MENJEBAK ERROR 16.1 Pendahuluan Dalam pembuatan sebuah program sering munciil error (kesalahan) dan bug, yang sering disebut dengan istilah eksepsi (exception). Prioritas utama bagi seorang programmer yang berpengalaman adalah membuat program yang terbebas dari kesalahan pada saat runtime (waktu program dijalankan). Hal ini bukan merupakan hal yang mudah karena di sini kita harus pandai dalam menentukan kemungkinan-kemungkinan yang akan menyebabkan terjadinya error pada program kita. Setelah tahu apa yang mungkin menyebabkan terjadinya error, kemudian kita harus dapat mencegahnya sehingga meskipun hal itu terjadi, maka error tersebut tidak akan menghambat jalannya program. Proses seperti inilah yang disebut dengan penjebakan error atau yang lebih dikenal dengan istilah exception handling. Pada bagian ini kita akan mempelajari bagaimana C + + dapat mencegah eksepsi-eksepsi yang terjadi. Walaupun demikian, perlu diperhatikan bahwa exception handling hanya terdapat pada kompiler C++ yang bahasanya telah memenuhi C + + standar. Artinya jika Anda menggunakan kompiler C++ lama yang tidak mendukung exception handling, maka Anda tidak dapat melakukan kompilasi program yang terdapat pada latihan-latihan dalam bab ini. Bab 16: Menjebak Error

19 16.2 Dasar-dasar Penjebakan Error Untuk melakukan penjebakan error di dalam C+ +, terdapat tiga buah kata kunci yang akan digunakan yaitu try, catch dan throw. Konsep kerjanya sederhana, mula-mula program akan melakukan eksekusi terhadap satatemen-statemen yang terdapat pada blok try. Jika eksekusi berjalan baik (tidak terdapat error), maka statemen yang terdapat pada bagian catch akan diabaikan. Namun jika terjadi error, maka error tersebut akan dilempar dengan statemen throw dan ditangkap dengan menggunakan statamen catch. Setelah ditangkap, maka error tersebut digantikan dengan statemen yang biasanya berupa sebuah pesan kesalahan. Statemen yang digunakan untuk menggantikan error yang terjadi ini disebut dengan istilah error handler. Berikut ini bentuk umum dari penulisan sebuah blok yang dapat mencegah terjadinya error di dalam C + +. try { Statemen yang_mungkin_menyebabkan_errorf catch (tipe_data parameter) { Statemen_yang_diguiiakaii untuk_mengatasi_errorf Statemen yang terdapat dalam blok try di atas dapat berupa statemen-statemen pendek atau dapat juga statemen-statemen yang telah didefinisikan dalam sebuah fungsi. Berikut ini contoh program yang akan mengilustrasikan cara kerja dari exception handling. #include <iostream> int main' int X; Kode Program 16-1 cout«"nilai yang dimasukkan adalah "<1«Xj >y fe catch (int E) { cout«"program telah menangkap eksepsi yang bernilai cout«e; Apabila program di atas dijalankan dan kita memasukkan nilai positif (lebih besar nol) maka contoh hasil yang akan diberikan dari program di atas adalah sebagai Masukkan sebuah bilangan bulat positif : 1 Nilai yang dimasukkan adalah : 1 Hasil di atas merupakan hasil yang berjalan dengan baik tanpa adanya hal yang tidak diinginkan sehingga statemen yang terdapat pada bagian catch pun akan diabaikan. Namun apabila kita memasukkan nilai negatif, maka yang terjadi adalah seperti pada contoh hasil berikut Masukkan sebuah bilangan bulat positif : -25 Program telah menangkap eksepsi dengan nilai: -25 Program di atas hanya akan menangkap eksepsi yang bertipe int saja, sedangkan jika kita akan melakukan penjebakan terhadap data yang bertipe lain, maka proses penangkapannya juga harus disesuaikan dengan tipe data yang dimasukkan. Sebagai contoh, kita akan melakukan penangkapan eksepsi dengan data bertipe double, maka kita harus menuliskannya seperti pada sintaks di bawah ini. Mnclude <iostream> Kode Program 16-2 if (X <= ) { throw X;, } else { Pemrograman O double X; try { Bab 16: Menjebak Error

20 cout«"masukkan sebuah bilangan bulat positif : ', cout«" return ; (double E] Pada program di atas, apabila kita memasukkan nilai variabel b yang lebih besar dari nol, maka program akan berjalan dengan baik tanpa adanya suatu error. Adapun contoh hasilnya adalah seperti berikut. Masukkan bilangan yang akan dibagi Masukkan bilangan pembagi :7.5 :3. Sekarang kita akan mencoba untuk rnelakukan penjebakan error yang statemen-statemennya telah didefinisikan di dalam sebuah fungsi. Berikut ini contoh programnya. finclude <iostream> Kode Program 16-3 void BAGI(double X, double Y) { double HASIL; Iif (Y!= ) { HASIL = X/Y; cout«"hasil bagi = "«HASIL? } else { throw Y; 1 // Fungsi utama int main () {. ; try { cout«"masukkan bilangan yang akan dibagi cin»a; cout«"masukkan bilangan pembagi cin»b; cout«endl ; Memanggil fungsi BAGI Hasil bagi = 2.5 Namun jika variabel b bernilai nol, maka hal ini akan menimbulkan masalah di dalam program. Namun karena kita telah mendefinisikannya di dalam blok try. maka hal ini akan dicegah dengan rnelakukan eksekusi terhadap statemen yang terdapat pada bagian catch. Berikut ini hasil yang akan diberikan jika kita memasukkan nilai nol ke dalam variabel b. Masukkan bilangan yang akan dibagi : 7.5 Masukkan bilangan pembagi : Kesalahan : Terjadi pembagian dengan 16.3 Menjebak Banyak Error C++ mengizinkan kita untuk dapat rnelakukan penjebakan error dari banyak tipe eksepsi. Hal ini sering disebut dengan multiple catch. Adapun bentuk umum dari penjebakan error yang melibatkan banyak tipe eksepsi adalah seperti terlihat di bawah ini. try { Statemen yang_muiiffkin menyebabkaii_error/ } catch (tipe_datal parameter 1) { Statemen_yang digunakan_untuk_meagata8j._error/ catch (doi Pemrograman Bab 16: Menjebak Error

21 catch (tipe_data2 parameters) { Statemen_yang_diguxiakan_uatukjmengatasi_e catch (tipe_datan parametern) { Statemen_yang_<31gunakan_untukjaiengatasi_error/ Berikut ini contoh program yang menunjukkan hal tersebut. tinclude <iostream> template <class T> void LEMPAR( T X) { Jika Anda masih bingung dengan kehadiran kata kunci template di atas, coba Anda buka bab selanjutnya yang membahas tentang template. Namun, yang pasti program di atas akan memberikan hasil seperti berikut. Menangkap eksepsi dengan tipe data int, yaitu : 1 Menangkap eksepsi dengan tipe data double, yaitu : 25.3 Menangkap eksepsi dengan tipe data char, yaitu : C Menangkap eksepsi dengan tipe data char*, yaitu : C + + Hal di atas menunjukkan bahwa statemen catch akan menangkap eksepsi sesuai dengan tipe data yang didefinisikan. Sebagai bukti pernyataan ini, perhatikan kembali contoh program berikut. ttinclude <iostream> Scatch (int El) { cout«"menangkap eksepsi dengan tipe data int, yaitu :1 cout«el«endl ; catch (double E2) { cout«"menangkap eksepsi dengan tipe data double, y^ cout«e2«endl ; } catch (char E3) { cout«"menangkap eksepsi dengan tipe data char, yaitu :.;.- cout«e3«endl; : 1 [catch (char* E4) { cout«"menangkap eksepsi dengan tipe data char*, yaitu cout«e4«endl; template <class T> void LEMPAR(T X) { try { if (X) { throw X; catch (int El) { cout«"menangkap eksepsi dengan tipe data int, yaitu : cout«el«endl; catch (double E2) { cout«"menangkap eksepsi dengan tipe data double, yait cout«e2«endl: // Fungsi utama int main{) { LEMPAR(IO); LEMPAR(25.3); LEMPAR( X C'); LEMPAR("C++"); return ; Pemrograman LEMPAR("Mengungkap Rahasia C++"); return ; Pada program di atas kita hanya mendefinisikan statemen catch untuk menjebak eksepsi yang bertipe int dan double. Sedangkan nilai yang dilewatkan di dalam fungsi LEMPAR () bertipe char*, yaitu "Mengungkap Rahasia C+ + ". Hal ini jelas akan Bab 16: Menjebak Error

22 menimbulkan masalah dan program akan langsung dihentikan secara tidak normal. Penyebab dari munculnya masalah tersebut adalah karena kita tidak mendefinisikan statemen catch untuk tipe char*. Untuk itu, seharusnya kita tetap melakukan pencegahan eksepsi dari berbagai tipe data yang mungkin Menjebak Semua Jenis Error Pada sub bab sebelumnya kita telah mempelajari bagaimana cara mendefinisikan statemen catch untuk menangkap tipe eksepsi yang spesifik. Namun di sana, kita masih harus mendefinisikannya untuk setiap tipe data. Sebenarnya, C++ telah menyediakan cara untuk menangkap semua tipe eksepsi, yaitu dengan mendefinisikannya dalam statemen catch yang mempunyai parameter... (titik tiga kali). Untuk lebih memperjelas, berikut ini bentuk umum dari penulisan sebuah blok try yang akan menangkap semua tipe eksepsi yang terjadi di dalam program. try { StatemeD_jyang_mungkiajmeayebabkaa._errorf } catch (...) { Statemen_jyang_digunakan_'untuk_meiigatasi_error/ Statemen catch (...) di atas menunjukkan bahwa program hanya mempunyai sebuah exception handler yang akan dibangkitkan ketika terjadi eksepsi dari tipe data apapun. Berikut ini contoh program yang akan mengilustrasikan hal tersebut. #include <iostream> Kode Program 16-6 template <class T> void LEMPAR(T X] try { if (X) { throw X; } catch (...) { cout«"program menemukan sebuah kesalahan"«e // Fungsi utama iht main() { LEMPAR(2); LEMPAR(13.3); LEMPAR('C') ; LEMPAR("Mengungkap Rahasia C++ return ; Setiap tipe eksepsi yang dibangkitkan oleh program di atas melalui statemen throw, statemen catch akan menangkapnya dengan sebuah pesan yang sama, yaitu "Program menemukan sebuah kesalahan". Oleh karena pada fungsi main () (fungsi utama) di atas terdapat empat pemanggilan fungsi LEMPAR (), maka program di atas akan memberikan hasil seperti yang tampak di bawah ini. Program menemukan sebuah kesalahan Program menemukan sebuah kesalahan Program menemukan sebuah kesalahan Program menemukan sebuah kesalahan Apabila kita amati hasil program di atas, hanya terdapat satu statemen yang digunakan untuk mengatasi eksepsi, walaupun eksepsi di atas masing-masing bertipe int, double, char dan char*. Perlu sekali untuk diperhatikan bahwa statemen catch (...) juga dapat digunakan berbarengan dengan statemen catch lainnya, asalkan penulisannya harus ada di posisi paling bawah. Jika ditempatkan di atas atau di tengah-tengah, maka kompiler akan menampilkan kesalahan dan program tidak dapat dijalankan. Sebagai contoh, di bawah ini adalah contoh program yang salah. #include <iostream> Kode Program 16-7 template <class T> void LEMPAR(TX) { try {*JiIt':' Bab 16: Menjebak Error

23 if (X) { throw X; cout«"menangkap eksepsi dari tipe data lain"«endl; catch (...) { cout«"menangkap eksepsi dari tipe data lain"«endl; // Fungsi utama int main{) { catch (int El) { cout«"menangkap eksepsi dengan tipe data int, yaitu cout<<el«endl,- i LEMPAR( ' C ' ) ; LEMPAR(23); LEMPAR(1.89}; LEMPAR("Penerbit INFORMATIKA Bandung"); return ; cout«e2«endl ; Seharusnya program di atas dituliskan seperti berikut. Kode Program 16-8 :atch (int El) { cout«"menangkap eksepsi dengan tipe data int, yaitu : ",- cout«el«endl; catch (double E2) { cout«"menangkap eksepsi dengan tipe data double, yaitu cout«e2«endl ; } catch (...) { Pada program di atas kita hanya mendefinisikan statemen catch untuk tipe data int dan double saja sehingga jika terjadi eksepsi dari data lain (misalnya char atau char*) maka program akan menangkapnya dengan statemen yang terdapat pada bagian catch (...). Berikut ini adalah hasil yang akan diberikan dari program di atas. Menangkap eksepsi dari tipe data lain Menangkap eksepsi dengan tipe data int, yaitu : 23 Menangkap eksepsi dengan tipe data double, yaitu : 1.89 Menangkap eksepsi dari tipe data lain 16.5 Menjebak Error yang Bertipe Kelas Selain menangkap eksepsi yang berasal dari tipe data dasar, C+ + juga mengizinkan kita untuk menangkap eksepsi yang bertipe kelas. Justru pada prakteknya, program-program yang ditulis dengan C++ kebanyakan menggunakan eksepsi yang bertipe kelas. Berikut ini contoh program yang mengilustrasikan hal di atas. tinclude <iostream> tinclude <cstring> // Membuat kelas eksepsi Bab 16: Menjebak Error Kode Program 16-9

24 class EKSEPSI { char* pesan; public: // Mendefinisikan fungsi EKSEPSI(char* S) { strcpy(pesan, S); V Mendefinisikan fungsi destructor -EKSEPSI() { delete pesan; } // Mendefinisikan fungsi untuk mendapatkan nilai vari // pesan char* GetPesanO { return pesan; } // Fungsi utama int X; try { cout«"masukkan sebuah bilangan bulat negatif : "; cii cout«endl ; if (X >= ) { throw EKSEPSI ("Nilai yang Anda masukkan bukc negatif"); } else { cout«"nilai yang Anda masukkan adalah : "«X; Seperti biasa, apabila kita memasukkan nilai sesuai yang diminta (yaitu nilai negatif) maka statemen yang terdapat pada bagian catch tidak akan dieksekusi. Namun, jika kita melakukan kesalahan yaitu dengan memasukkan nilai positif, maka program akan melemparkan eksepsi EKSEPSI dan menggantikannya dengan menampilkan pesan sesuai parameter yang terdapat dalam proses constructor-nya. Berikut ini contoh hasil dari program di atas apabila kita memasukkan nilai negatif. Masukkan sebuah bilangan bulat negatif : -2 Nilai yang Anda masukkan adalah : -2 Pemrograman. Sedangkan apabila kita memasukkan nilai nol atau positif, maka contoh hasilnya akan tampak seperti berikut. Masukkan sebuah bilangan bulat negatif : 1 Nilai yang Anda masukkan bukan negatif 16.6 Blok try Bersarang Dalam C + +, kita diizinkan untuk membuat blok try bersarang. Artinya di dalam blok try terdapat blok try lagi. Hal ini hanya dilakukan jika kita benar-benar membutuhkannya. Berikut ini contoh program yang menunjukkan hal tersebut. #include <iostream> Kode Program 16-1 //Fungsi utama int main ( ) { MlH int X; J^H jj&u&iiil^^^^b try { JB^B try cout«{ "Masukkan sebuah bilangan bulat negatif :^^^^^^^^B ^^^^B cin»x; i^^^^^^li if (X > ) { I^^^HIj throw X; i^^^^^^b catch (...) { l^^e cout«"menangkap eksepsi dalam blok try kedua"«enci^^^^b } "WI^H if (X) throw X; '^H fli catch (int E) { ^H cout«" Menangkap eksepsi dalam blok try pertama"«end]^^b return ;,. N -if^l x v-- ' - --:'-fe:3 MH Hasil yang akan diberikan dari program di atas adalah sebagai berikut : Bab 16: Menjebak Error

25 Masukkan sebuah bilangan bulat negatif : 1 Menangkap eksepsi dalam blok try kedua Menangkap eksepsi dalam blok try pertama 16.7 Mengenal Fungsi terminate () dan unexpected() Jika dalam program kita terjadi sebuah eksepsi dan program tidak menemukan exception handler yang sesuai, maka secara otomatis program akan memanggil fungsi terminate (). Secara default, fungsi terminate () ini sebenarnya memanggil fungsi yang lain, yaitu fungsi abort () yang akan menyebabkan terhentinya program. Adapun prototipe dari fungsi ini sesuai dengan C+ + standar adalah seperti berikut. m,, m, r,,,, nr,,^^^ void terminate<), Untuk lebih memahaminya, perhatikan program di bawah ini. Kode Program int X; try { cout«"masukkan sebuah bilangan bulat if (X) { throw, X; ;ch (double El) { cout«"menangkap eksepsi dengan tipe double"; ; catch (char E2) { cout«"menangkap eksepsi dengan tipe char"; } catch (char* E3) { cout«"menangkap eksepsi dengan tipe char*"; eturn ; Pada saat program di atas dijalankan dan kita memasukkan nilai maka program akan dihentikan secara tidak normal. Hal ini sebenarnya disebabkan karena kita tidak melempar eksepsi dengan tipe int, sedangkan kita hanya mendefinisikan statemen catch untuk tipe double, char dan char* saja sehingga eksepsi tersebut tidak dapat ditangkap. Oleh karena itu, program secara otomatis memanggil fungsi terminate () sehingga program akan dihentikan. Sedangkan fungsi unexpected() dipanggil pada saat terdapat statemen yang mencoba atau berusaha melempar sebuah eksepsi yang tidak boleh dilempar dengan menggunakan kata kunci throw. Secara default, fungsi unexpected () ini akan memanggil fungsi terminate (). Adapun prototipe dari fungsi ini adalah sebagai berikut. void unexpected (, 16.8 Eksepsi Standar dalam C++ C++ telah menyediakan kelas-kelas eksepsi standar yang dapat langsung kita gunakan. Adapun beberapa yang termasuk ke dalamnya adalah seperti yang terlihat pada tabel di bawah ini. Eksepsi bad_alloc bad_cast bad_typeid bad_exception out_of_range invalid_argument overf low_error ios_base: : failure File header yang digunakan <new> <typeinf o> <typeinf o> <exception> <stdexcept> <stdexcept> <stdexcept> <ios> Berikut ini gambar yang menunjukkan hirarki dari kelas eksepsi yang terdapat dalam C+ +. Bab 16: Menjebak Error

26 logic_error exception runtime error BAB 17 TYPECASTING DAN RTTI length_error domain_error out_of_range range_error overflow error underflow error invalid_argument bad alloc bad_exception bad cast badjypeid ios base-failure 17.1 Pendahuluan Typecasting adalah menganggap suatu variabel atau objek yang memiliki tipe tertentu dengan tipe data yang lain. Sebagai contoh, dalam program kita mempunyai variabel X yang bertipe int. Namun suatu saat kita dapat menggunakan variabel tersebut sebagai tipe char. Di sini, berarti kita telah melakukan typecasting terhadap variabel X, yaitu dengan menganggap tipe int sebagai tipe char. Berikut ini bentuk umum untuk melakukan typecasting terhadap variabel atau objek tertentu dalam bahasa C. tipe_data (nama_var label) / atau ftipe_data; nama_variabel/ Namun dalam C + +, masih terdapat empat macam typecasting yang masing-masing mempunyai fungsi-fungsi spesifik. Adapun keempat macam itu adalah dynamic_cast, const_cast, static_cast dan reinterpret_cast. Bab 17: Typecasting dan RTTI

27 17.2 Menggunakan dynamic_cast Typecasting ini dilakukan untuk objek yang bertipe kelas dimana kelas tersebut adalah kelas turunan dari kelas yang lainnya. Sebagai contoh kita mempunyai kelas B yang merupakan turunan dari kelas A. Maka dengan menggunakan dynamic_cast, kita akan selalu dapat menganggap objek dengan tipe A sebagai objek B. Selain itu kita juga dapat menganggap objek B sebagai objek A jika pointer sedang menunjuk ke objek A, Jika tidak maka proses typecasting tidak dapat dijalankan. Adapun bentuk umum dari penggunaan dynamic_cast ini adalah sebagai berikut : ic_cast <T> (ekpresi); T di atas tidak lain merupakan sebuah tipe target yang harus merupakan sebuah pointer ataupun reference. Sedangkan ekspresi di atas merupakan ekspresi yang akan dilakukan cast (dianggap sebagai tipe lain). Untuk dapat lebih memahami konsepnya, berikut ini contoh-contoh program yang memperlihatkan cara kerja dari dynamic_cast. Pada contoh ini, kita akan melakukan casting dari objek yang bertipe INDUK ke objek yang bertipe TURUNAN. Adapun sintaks programnya adalah sebagai Kode Program 17-1 INDUK *PI, Ob_I; : -; " ifl // Mendeklarasikan pointei // untuk tipe TURUNAN INDUK *PT, Ob_T; MMHMWH«MMMHHMMMMMMWI fukan ins stansiai // Memerintahkan pointer PI untuk menunjuk ke alamat ob // Ob T n; PI = &Ob_T; // Melakukan typecasting terhadap pointer PI sebagai po // yang akan menunjuk ke tipe TURUNAN PT = dynamic cast <TURUNAN *> (PI); if (PT) { cout«"typecasting sukses"; return Hasil dari program di atas adalah sebagai berikut Typecasting sukses Seperti yang kita lihat di atas bahwa pointer PI yang sebelumnya bertipe INDUK dapat kita lakukan typecasting ke tipe TURUNAN, Hal ini bisa dilakukan karena secara aktual pointer PI sedang menunjuk ke alamat dari objek yang bertipe TURUNAN (dalam hal ini objek Ob_T). Apabila pointer PI tidak menunjuk ke tipe TURUNAN, maka proses typecasting akan gagal. Berikut ini contoh program yang mendemonstrasikan hal tersebut. tinclude <iostream> cout«"ini di dalam kelas turunan"«endl class INDUK { public : virtual TULISO { } // Fungsi utama // Mendeklarasikan pointer dan melakukan instansiasi // untuk tipe INDUK class TURUNAN { public : TULISO { cout«"ini di dalam kelas turunan"«endl, Bab 17: Typecasting dan RTTI

28 // Fur. // Mendeklarasikan pointer dan melakukan instansiasi // untuk tipe INDUK INDUK *PI, Ob_I; // Mendeklarasikan pointer dan melakukan instansiasi // untuk tipe TURUNAN INDUK *PT, Ob_T; Melakukan typecasting terhadap pointer PI sebagai yang akan menunjuk ke tipe TURUNAN = dynamic_cast <TURUNAN *> (PI); Jika dijalankan, maka program di atas pasti akan memberikan hasil sebagai berikut : Typecasting gagal Berikut ini contoh program yang akan memperlihatkan kemungkinan-kemungkinan proses typecasting dengan menggunakan dynamic_cast. ffinclude <iostream> ising namespace std; public: void TULIS cout«"ini di dalam kelas // Fungsi utama int main(5 { // Mendeklarasikan pointer dan melakukan instansiasi // untuk tipe INDUK INDUK *PI, Ob_I; '// Mendeklarasikan pointer dan melakukan instansiasi // untuk tipe TURUNAN TURUNAN *PT, Ob_T; // Melakukan typecasting dari tipe INDUK ke tipe INDUK PI = dynamic_cast<induk *> (&Ob_I); if (PI) { cout«"typecasting dari tipe INDUK " \ "ke tipe INDUK sukses"«endl; PI->TULIS(); } cout«endl ; // Melakukan typecasting dari tipe INDUK ke tipe TURUNAN PT = dynamic_cast<turunan *> (&Ob_I); if OPT) { cout«"typecasting dari tipe INDUK " \ w ke tipe TURUNAN gagal "«endl; } cout«endl ; // Melakukan typecasting dari tipe INDUK ke tipe TURUNJ PI = &Ob_T; ;PT = dynamic_cast<turunan *> (PI); if (PT) { cout«"typecasting dari tipe INDUK " \ "ke tipe TURUNAN sukses"«endl; PT~>TULIS(); } cout«endl ; // Melakukan typecasting dari tipe TURUNAN ke tipe TURUNAN PT = dynamic m cast<turunan *> (&Ob_T); If (PT) { cout«"typecasting dari tipe TURUNAN " \ "ke tipe TURUNAN sukses"«endl; PT->TULIS(); cout«endl; ^ '^ ^'^ ^ ^ MHI^^^^H^^^^^^^^^^^^H^MHMH^^B^^^^^^^^^^^^^^B^HHHHMMI^^Ha^^^B^HH Bab 17: Typecasting dan RTTI

29 // Melakukan typecasting dari tipe TURUNAN ke tipe INDUI PT = &Ob_T; PI = dynamic_cast<induk *> (PT) ; if (PI)/: { cout«" Typecasting dari tipe TURUNAN " \ "ke tipe INDUK sukses "«endl, PI->TULIS() Hasil yang akan diberikan dari program di atas adalah sebagai Typecasting dari tipe INDUK ke tipe INDUK sukses Ini di dalam kelas induk Typecasting dari tipe INDUK ke tipe TURUNAN gagal Typecasting dari tipe INDUK ke tipe TURUNAN sukses Ini di dalam kelas turunan Typecasting dari tipe TURUNAN ke tipe TURUNAN sukses Ini di dalam kelas turunan Typecasting dari tipe TURUNAN ke tipe INDUK sukses Ini di dalam kelas turunan 17.3 Menggunakan const_cast const_cast digunakan untuk melakukan typecasting pada konstanta, seperti halnya pada parameter yang bersifat konstan. Adapun bentuk umum dari penggunaan const_cast adalah sebagai Di sini, T adalah tipe yang akan dituju (tipe target), sedangkan ekspresi di atas adalah ekspresi yang akan dilakukan cast. Berikut ini contoh penggunaan const_cast di dalam program. tinclude <iostream> void Kuadrat(const int *X) { int *P; Kode Program 17-4 // Melakukan typecasting terhadap X P = const_cast<int *> (X); // Melakukan perkalian nilai *P = (*X) * (*X) ; // Mendeklarasikan variabel A yang bertipe int int A; // Memanggil nilai A cout«"nilai A awal : "«A«endl; // Memanggil fungsi Kuadrat dengan alamat A // sebagai parameternya Kuadrat(&A); : // Memanggil kembali nilai A cout«"nilai A akhir : "«A«endl; return ; Hasil yang akan diberikan dari program di atas adalah sebagai Nilai A awal : 5 Nilai A akhir : Menggunakan static_cast static_cast digunakan untuk melakukan konversi-konversi standar, misalnya dari tipe int ke double atau dari tipe char ke int. Bentuk ini juga berlaku untuk tipe struktur maupun pointer, namun yang perlu diperhatikan yaitu kita tidak dapat melakukan Bab 17: Typecasting dan RTTI

30 konversi dari satu bentuk ke bentuk yang lainnya dengan menggunakan static_cast. Misalnya dari tipe dasar ke tipe pointer ataupun sebaliknya. Bentuk umum dari penggunaan static_cast adalah seperti yang tampak di Sama seperti sebelumnya, T adalah tipe target dan ekspresi adalah ekspresi yang akan dilakukan cast ke tipe baru. Untuk lebih memperjelas pembahasan mengenai materi ini, perhatikan contoh program berikut. tinclude <iostream> darasikan variabel yang bertipe int ian menampilkan nilai X sebagai tipe int 17.5 Menggunakan reinterpret_cast Dengan menggunakan reinterpret_cast, kita dapat melakukan typecasting dari tipe dasar ke tipe pointer ataupun sebaliknya. Sebagai contoh kita mempunyai variabel X yang bertipe int dan pointer P yang menunjuk ke tipe int, maka kita dapat melakukan typecasting terhadap X ke P atau dari P ke X. Adapun bentuk umum dari penggunaan reinterpret_cast adalah seperti yang tampak di bawah ini. reinterpret_cast<t> (ekspresi)/ Berikut ini contoh program yang menunjukkan proses typecasting dengan menggunakan reinterpret_cast. tinclude <iostream> Kode Program 17-6 int X = 1; int *P; // Melakukan typecasting dari tipe int ke pointer P = reinterpret_cast<int *> (X); Hasil yang akan diberikan dari program di atas adalah sebagai // Menampilkan nilai P cout«"nilai P : "<<p«endl; return Contoh hasil yang akan diberikan dari program di atas adalah sebagai Nilai P : OOOOOOOA Bab 17: Typecasting dan RTTI

31 Sekarang, perhatikan contoh program yang melakukan typecasting dari tipe pointer ke tipe int. #include <iostream> Kode Program 17-7 // Mendeklarasikan variabel bertipe int int X, I; //Mendeklarasikan pointer yang menunjuk ke tipe int Int *P = &X; // Melakukan typecasting dari tipe pointer ke tipe i I = reinterpret_cast<int> (P) ; // Menampilkan nilai P dan I : cout«"nilai P : "«P«endl; cout«"nilai I : "«I«endl; mendapatkan nama tipe adalah name. Adapun bentuk umum dari penggunaan typeid ini adalah seperti yang tampak di bawah ini. :; typeid (nama_objek)/ ^flhhhr ; :' flhhhmh@hl nama_objek yang dimaksud di atas adalah semua objek yang terdapat dalam C+ +, bisa berupa variabel maupun instance dari suatu kelas. Adapun tipe yang didapatkan juga dapat berupa tipe dasar, tipe bentukan ataupun tipe kelas. Berikut ini contoh program yang mendemonstrasikan prinsip di atas. linclude <iostream> #include <typeinfo> Kode Program 17-8 // Mendefinisikan kelas MANUSIA sebagai kelas dasar atau indi class MANUSIA { public: virtual void BerjalanO { }; // bersifat polymorphic Contoh hasil yang akan diberikan dari program di atas adalah sebagai Nilai P : 65FEOO Nilai I : // Mendefinisikan kelas MAHASISWA sebagai turunan dari kelas // MANUSIA class MAHASISWA: public MANUSIA { public: void BerjalanO { cout«"mahasiswa berjalan dengan cara SANTAl"«endl; 17.6 Run-Time Type Identification (RTTI) Bagi Anda yang sebelumnya terbiasa memogram dengan bahasa non-polymorphic, seperti bahasa C, mungkin istilah RTTI ini adalah rstilah baru bagi Anda. Dalam bahasa C, tipe data dari setiap objek hanya dikenali pada saat kompilasi saja. Namun pada bahasa polymorphic, seperti bahasa C+ +, kita dapat mengenali tipe data dari suatu objek pada saat program dieksekusi (run-time). Dalam C + +, untuk melakukan hal ini kita harus menggunakan kata kunci typeid, dimana sebelumnya kita juga harus mendaftarkan file header <typeinfo>. Member dari typeid yang digunakan untuk // Mendefinisikan kelas TENTARA sebagai turunan // dari kelas MANUSIA class TENTARA: public MANUSIA { public: void BerjalanO { cout«"tentara berjalan dengan cara TEGAP"«// Fungsi utama.// Mendeklarasikan variabel dengan tipe dasar int X; float Y; char C; " ^^^^^^^^^^^^^^M^^^^^^^^^^^^^^^^M^M^^^^^^^^^^^^^B^^^^^^^^^MiVmm^^^^M^^^^M Bab 17: Typecasting dan RTTI

32 // Mendeklarasikan objek yang bertipe ke TENTARA T; :MAHASISWA M; // Mendapatkan tipe masing-masing objek pada saat run-tj cout«"tipe dari: variabel X adalah : w «typeid(x).namef) cout«endl ; :Cout«"Tipe dari variabel Y adalah : "«typeid(y).nameo ; cout«endl; Tipe dari variabel C adalah : "«typeid(o.name mt«"tipe dari variabel str adalah : tt «typeid(str).name( // Mendefinisikan kelas MANUSIA setjjjjfri kelas dasar atau induk class MANUSIA { publi c: virtual void BerjalanO { }; //... // bersifat polymorphic // Mendefinisikan kelas MAHASISWA sebagai turunan dari kelas // MANUSIA Class MAHASISWA: public MANUSIA { public: void BerjalanO { cout«"mahasiswa berjalan dengan cara SANTAI"«endl Hasil yang akan diberikan dari program di atas adalah sebagai Tipe dari variabel X adalah : int Tipe dari variabel Y adalah : float Tipe dari variabel C adalah : char Tipe dari variabel str adalah : char * T merupakan objek yang bertipe : TENTARA M merupakan objek yang bertipe : MAHASISWA typeid pada Pointer Untuk mendapatkan tipe data dari objek yang ditunjuk oleh sebuah pointer, kita dapat menggunakan typeid pada pointer tersebut. Berikut ini contoh program yang membuktikan hal tersebut. ttinclude <iostream> tinclude <typeinfo> // Mendefinisikan kelas TENTARA sebagai turunan // dari kelas MANUSIA class TENTARA: public MANUSIA { public : void BerjalanO { cout«"tentara berjalan dengan cara TEGAP"«endl; }; // Fungsi utama // Mendeklarasikan pointer ke tipe MANUSIA MANUSIA *P; MANUSIA MNS; TENTARA T; MAHASISWA M; // Pointer P menunjuk ke alamat dari objek MNS P = &MNS; cout«"mns merupakan objek yang bertipe :<typeid(*p).name(); cout«endl; // Pointer P menunjuk ke alamat dari objek T P = &T; cout«"t merupakan objek yang bertipe : "«typeid (*P).name cout«endl ; // Pointer P menunjuk ke alamat dari objek M P = &M; cout«"m merupakan objek yang bertipe : "«typeid(*p).name I cout«endl; Pemrograman CH Bab 17: Typecasting dan RTTI

33 Hasil yang akan diberikan dari program di atas adalah sebagai MNS merupakan objek yang bertipe T merupakan objek yang bertipe M merupakan objek yang bertipe : MANUSIA : TENTARA : MAHASISWA Namun, perlu sekali diperhatikan bahwa pointer di atas berlaku untuk kelas yang bersifat polymorphic, sedangkan jika tidak (nonpolymorphic) maka tipe yang akan didapatkan selalu tipe dari kelas induknya. Berikut ini contoh program yang memperlihatkan konsep tersebut. Kode Program 17-1 // Mendefinisikan kelas MANUSIA sebagai kelas dasar atau ii Lass MANUSIA { xlic: ;;oid Berjalan() { }; // bersifat non-polymorphic // karena bukan virtual ' / Fungsi utamnt main() { // Mendeklarasikan pointer ke tipe MANUSIA MANUSIA *P; MANUSIA MNS; TENTARA T; MAHASISWA M; // Pointer P menunjuk ke alamat dari objek MNS P = &MNS; I cout«"mns merupakan objek yang bertip? «typeid( *P).name () ; cout«endl ; // Pointer P menunjuk ke alamat dari objek T P = &T; cout«"t merupakan objek yang bertipe : "«typeid(*p).name(); cout«endl ; // Pointer P menunjuk ke alamat dari objek M P = &M; cout«"m merupakan objek yang bertipe : "«typeid(*p).name () ; cout«endl; return ; Mendefinisikan kelas MAHASISWA sebagai turunan dari kelas MANUSIA class MAHASISWA: public MANUSIA { (void BerjalanO { cout«"mahasiswa berjalan dengan cara SANTAl"«endl IB // Mendefinisikan kelas TENTARA sebagai turunan // dari kelas MANUSIA class TENTARA: public MANUSIA { public: >id Berjalan () { cout«"tentara berjalan dengan cara TEGAP"«endl; Sekarang, hasil yang akan diberikan dari program di atas adalah sebagai MNS merupakan objek yang bertipe T merupakan objek yang bertipe M merupakan objek yang bertipe typeid pada Reference : MANUSIA : MANUSIA : MANUSIA Selain pada pointer, typeid juga dapat digunakan pada tipe reference. Berikut ini contoh program yang membuktikan pernyataan tersebut dimana terdapat sebuah fungsi yang dilewatkan berdasarkan re/erence-nya. Bab 17: Typecasting dan RTTI

34 #include <iostream> ftinclu.de <typeinfo> Kode Program lendefinisikan kelas MANUSIA sebagai kelas dasar atau induk class MANUSIA { public:. virtual void BerjalanO { }; // bersifat polymorphic Mendefinisikan kelas TENTARA sebagai turunan dari kelas Lass TENTARA: public MANUSIA { ' Mendefinisikan fungsi dengan parameter bertipe referei ' tipe MANUSIA >id CariTipe(MANUSIA& Ob) { cout«"b sedang mengacu ke objek yang bertipe : "; cout«typeid{b).nameo ; cout«endl; Hasil yang akan diberikan dari program di atas adalah sebagai Ob sedang mengacu ke objek yang bertipe : MANUSIA Ob sedang mengacu ke objek yang bertipe : TENTARA Ob sedang mengacu ke objek yang bertipe : MAHASISWA typeid pada Template Setelah mempelajari RTTI yang terdapat pada objek pointer dan reference, kini saatnya kita membahas typeid yang digunakan untuk sebuah template kelas. Pembahasan ini mungkin dapat dikatakan cukup berat, karena sejauh ini kita memang belum membahas mengenai template. Namun, Anda tidak perlu khawatir karena di dalam buku ini kita akan membahasnya lebih detil di bagian tersendiri, yaitu bab mengenai template. Untuk lebih mengetahui tentang typeid yang terdapat pada sebuah template kelas, perhatikan contoh program di bawah ini. tinclude <iostream> #include <typeinfo> Kode Program // Membuat template kelas template <class T> class CONTOH { T X; public: ' CONTOH(T XX) { X = XX; // Melakukan instansiasi CONTOH<int> 1(1), 2(2); CONTOH<double> 3(3.25); CONTOH<char> 4('C'}; // Mendapatkan tipe dari 1 cout«"tipe dari objek 1 adalah cout«typeid(1).nameo; cout«endl ; Bab 17: Typecasting dan RTTI

35 i Mendapatkan tipe dari O2 out«"tipe dari objek 2 adalah cout«typeid(2).name() ; cout«endl ; // Mendapatkan tipe dari 3 cout«"tipe dari objek 3 adalah : "? cout«typeid(3).name{) ; cout«endl ; BAB 18 TEMPLATE // Mendapatkan tipe dari 4 cout«"tipe dari objek 4 adalah : "? :cout«typeid (4).name () ; cout«endl ; return ; Hasil yang akan diberikan dari program di atas adalah sebagai Tipe dari objek Ol adalah : CONTOH<int> Tipe dari objek O2 adalah : CONTOH<int> Tipe dari objek O3 adalah : CONTOH<double> Tipe dari objek O4 adalah : CONTOH<char> 18.1 Pendahuluan Salah satu fitur C + + yang tidak dimiliki oleh kebanyakan bahasa pemrograman lainnya adalah template. Fitur ini dibuat beberapa tahun yang lalu dan telah didukung oleh semua kompiler C+ + modern (standar). Dengan menggunakan template, kita dapat membuat fungsi-fungsi atau kelas-kelas generik. Artinya, sekali kita membuat fungsi atau kelas tersebut, maka kita dapat menggunakannya untuk berbagai tipe data tanpa harus mengulang penulisan kode dari fungsi atau kelas tersebut. Dalam C + +, template dibuat dengan menggunakan kata kunci template. Template merupakan ide dasar dari pembentukan STL (Standard Template Library) yang digunakan untuk memudahkan dan mempercepat pembuatan program dengan menggunakan C + +. Pembahasan mengenai STL merupakan pembahasan yang sangat kompleks, untuk itu di dalam buku ini kita tidak akan mengkajinya. Meskipun demikian, dengan berbekal konsep yang akan dibahas dalam bab ini, diharapkan Anda tidak akan mengalami kesulitan yang berarti apabila Anda ingin mulai mempelajari STL dari liter atur lain. Bab 18: Template

36 Pada bagian ini kita akan membahas mengenai template secara lebih detil. Adapun dalam buku ini, pembahasan tersebut akan dibagi ke dalam dua bagian, yaitu template fungsi dan template kelas 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 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 tinclude <iostream> Kode Program 18-1 // 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 // Mendeklarasikan variabel J dan K yang bertipe int int J=1, K=2; '// Mendeklarasikan variabel A dan B yang bertipe char char A='A', B='B'; // Mendeklarasikan variabel Dl dan D2 yang bertipe double ;double Dl=25.2, D2 = 3.15; // Menampilkan nilai mula-mula cout«"nilai sebelum dilakukan pertukaran"«endl«endl; cout«"nilai J : w «J«endl; cout«"nilai K "«K«endl; cout«endl ; cout«"nilai A "«A«endl ; cout«"nilai B w «B«endl; cout«endl ; cout«"nilai Dl "«Dl«endl; cout«"nilai D2 u «D2«endl; Memanggil fungsi TUKAR(J, K); Bab 18: Template TUKAR untuk tipe data yang berbeda-beda // Parameter bertipe int

37 \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; "«J«endl; "«K«endl ; «A«endl; «B«endl; «Dl«endl «D2«endl Hasil yang akan didapatkan dari program di atas adalah sebagai Nilai sebelum dilakukan pertukaran Nilai J Nilai K Nilai A Nilai B Nilai Dl Nilai D2 1 2 A B Nilai setelah dilakukan pertukaran Nilai J Nilai K Nilai A Nilai B Nilai Dl Nilai D2 2 1 B A Seperti yang terlihat di atas, bahwa sekali kita mendefinisikan fungsi TUKAR (), kita dapat menggunakannya untuk tipe parameter yang berbeda-beda. Bentuk ini sebenarnya merupakan 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. Mnclude <iostream> Kode Program 18-2 // Mendefinisikan fungsi geenrik dengan nama TambahSatu template <class TIPEKU> int TambahSatu(TIPEKU X) { return (X+l); // Fungsi utama int A = 1; char B = 'E'; double C = 2.3 // 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

38 cout«tambahsatu (B) cout«tambahsatu(c) return ; Hasil yang akan diberikan dari program di atas adalah sebagai 11 F 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. Hasil yang akan diberikan dari program di atas adalah sebagai 23 Mengungkap Rahasia C+ + Oleh Budi Raharjo 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. #include <iostream> Kode Program 18-4 // Mendefinisikan template fungsi TULIS // dengan satu tipe data generik template <class TIPE1> void TULIS (TIPE1 X) { cout«x«endl ; PIPEl, class TIPE2> void TULIS(TIPE1 X, TI // Mendefinisikan template fungsi TULIS // dengan dua tipe data generik template <class TIPE1, class TIPE2> void TULIS (TIPE1 X, TIPE2 Y) { cout«x«' ' «Y«endl ; Fungsi upama it main () { // Mendeklarasikan variabel J yang bertipe long long J=23; // 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 ; // 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

39 // Memanggil fungsi TULIS dengan satu pa, TULIS(23); return ; ertipe long Hasil yang akan diberikan dari program di atas adalah sebagai Mengungkap Rahasia C+ + Penerbit INFORMATIKA Bandung Budi Raharjo 23 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 // Mendeklarasikan variabel a dan b yang bertipe int int a=1, b=2q; f / Memanggil fungsi template rulis(a); :out«endl ; ''/ Memanggil fungsi biasa rulis(a, b); return ; Hasil yang akan diberikan dari program di atas adalah sebagai Di dalam template fungsi 1 Di dalam fungsi biasa 1 dan 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. tinclude <iostream> Kode Program 18-6 // 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++) { for (int k=(n-l); k>=l; k--) if (P[k-.ll > P[k]) { X = P[k-l] ; P[k-l] = P[k] ; P[k] - X; Bab 18: Template

40 ' Fungsi utama it main () { // array dari tipe int int A[5J = { 2, 5, 4, 3, 1 }; / array dari tipe double ouble B[5] = { 2.13, 4.35, 1.2, 2.3, 1.75 /array dari tipe char bar C[51 = { 'D', >B', 'E', 'C', 1 A' }; / 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=; I<5; I++) { cout«a [!] cout«"nilai dari array B : "; or (1=; I<5; illkan nilai setelah dilakukan pengurutan data cout«"nilai dari array C for (1=; I<5; I++) { COUt«C[I]«", "; } return ; Hasil yang akan diberikan dari program di atas adalah sebagai Sebelum diurutkan Nilai dari array A : 2, 5, 4, 3, 1 Nilai dari array B : 2.13, 4.35, 1.2, 2.3, 1.75 Nilai dari array C : D, B, E, C, A Setelah diurutkan Nilai dari array A : 1, 2, 3, 4, 5 Nilai dari array B : 1.2, 1.75, 2.3, 2.13, 4.35 Nilai dari array C : A, B, C, D, E 18.3 Template Kelas Selain menyediakan template untuk fungsi, C + + juga mengizinkan kita untuk membuat sebuah template kelas. Sama seperti pada fungsi generik, kelas generik juga dapat digunakan untuk tipe-tipe data yang berbeda. Dalam pendefinisian sebuah kelas yang telah kita pelajari sebelumnya, pendeklarasian datanya dilakukan dengan tipe data tertentu sehingga kelas ini hanya dapat digunakan untuk tipe data tersebut saja. Dengan adanya tipe generik yang dideklarasikan dalam sebuah template kelas, maka satu kelas dapat digunakan untuk melakukan manipulasi nilai yang beraneka-ragam tipe datanya Mendefinisikan Template Kelas Pada prinsipnya pendefinisian sebuah template kelas adalah sama dengan pendefinisian kelas biasa, hanya saja variabel yang dideklarasikan di dalamnya bersifat generik. Adapun bentuk umum dari pendefinisian sebuah template kelas (kelas generik) adalah seperti yang terlihat di bawah ini. Bab 18: Template

41 template <class T> class nama_kelas acces8_spec±f±ers data_data/ ±_f ungs± / Sedangkan proses instansiasi dari template kelas tersebut rnempunyai bentuk umum seperti berikut. nana_kelas <tipe_data> nama_instance/ ' '. '^^- Berikut ini contoh program yang akan menunjukkan pembentukan sebuah template kelas. tinclude <iostream> / Mendefinisikan sebuah template kelas dengan nama CONTOH late <class TIPEKU> class CONTOH { TIPEKU X; // Mendeklaraslkan variabel bertipe generik dan bersifat private iblic: CONTOH(TIPEKU XX) { X = XX; } // Constructor void TampilkanXO { cout«x«endl ; Hasil yang akan diberikan dari program di atas adalah sebagai berikut : a RahasiaC+ + Seperti yang kita lihat di atas bahwa parameter yang dilewatkan pada constructor kelas CONTOH memiliki tipe yang berbeda-beda, inilah yang disebut dengan template kelas atau kelas generik Template Kelas dengan Dua Tipe Data Generik Sama seperti pendefinisian fungsi generik, pada pendefinisian template kelas juga dapat terdiri dari dua atau lebih tipe data generik. Berikut ini contoh program yang menunjukkan hal tersebut. #include <iostream> Kode Program 18-8 Melakukan instansiasi kelas CONTOH dengan nama instance A, B, C dan D Parameter constructor-nya bertipe int X>NTOH <int> A (1) ; // Parameter constructor-nya bertipe double X)NTOH <double > B(2.3 5); // Parameter constructor-nya bertipe char :ONTOH <char> C( x a'); // Parameter constructor-nya:bertipe char* :ONTOH <char*> D("Rahasia C++"); // Memanggil fungsi TamplkanX dari setiap instance L.TampilkanX() ; s.tampilkanx() ; C.TampilkanXO ; D.TampilkanX() ; Pemrograman // Mendefinisikan template kelas dengan dua buah tipe generik template <class TIPE1, class TIPE2> class CONTOH { TIPE1 X; TIPE2 Y; public: CONTOH{ TIPE1 XX, TIPE2 YY) { X = XX; Y = YY; } void TampiIkanXY() { cout«x«" dan "«Y«endl; // Fungsi utama I// Melakukan instansiasi kelas CONTOH i// Parameter constructor-nya bertipe int dan int ICONTOH <int, int> A(1, 2); Bab 18: Template

42 'arameter constructor-nya bertipe ±nt dan double 'OH <int, double> B(14, 5.35); 'arameter cons true tor-nya bertipe char dan char* ONTOH <char, char*> C('C', "C++"); // Memanggil fungsi TampilkanXY dari setiap instance A.TampIlkanXYO ; B.TampilkanXYO ; C.TampilkanXY(); return ; Hasil yang akan diberikan dari program di atas adalah sebagai 1 dan 2 14 dan 5.35 C dan C Menggunakan Template Kelas Pada bagian ini kita akan membuat program yang mengimplementasikan penggunaan sebuah template kelas. Adapun template kelas yang akan dibuat sebagai contoh adalah kelas STACK. Menurut definisinya, stack merupakan sebuah tumpukan data yang dapat kita tambah/tempatkan (push) ataupun kita ambil kembali (pop) dimana data yang ditempatkan pertama kali akan diambil terakhir kali. Di sini, kita akan menjadikan kelas STACK tersebut dapat bekerja untuk berbagai macam tipe data. Berikut ini sintaks program yang akan menunjukkan hal tersebut. Kode Program 18-9 // Membuat fungsi Pu tuk menempatkan data ke stack void Push(T Objek) { if (atas == MAKS) { cout«"stack telah penuh"«endl; } else { S[atas] = Objek; atas++; // Membuat fungsi Pop untuk mengambil data dari stack T Pop() { if (atas == ) { cout«"stack kosong atau tidak berisi data"«endl; return ; // Mengembalikan nilai NULL } atas--; return S[atas] ; // Fungsi utama // Mendeklarasikan dua buah variabel yang masing-masing // bertipe int dan char j int J; '"' char C ;! // Membuat stack yang bertipe int STACK<int> SI; 1 // Menempatkan data ke dalam stack SI 1 for (J=; J<5; J++) { 1 Sl.Push(J+l); // Mengambil data dari stack Si dan menampilkannya ke layar for (J=; J<5; J++) { cout«sl. Pop () «endl ; y cout«endl; // Membuat stack yang bertipe char STACK<char> S2; // Menempatkan data ke dalam stack S2 for (C='A'; C<='E'; C++) { S2.Push(C) ; class STACK { // Indeks paling atas dari stack blic: STACK() { atas = ; // Melakukan inisialisasi,,/;/ Pemrograman // Mengambil data dari stack S2 dan menampilkannya ke laya, for (C='A'; C<='E'; C++) { cout«s2. Pop () «endl; return ; Bab 18: Template

43 Apabila dijalankan, program di atas akan memberikan hasil sebagai Sedangkan untuk pendefinisian template kelas. template < typename T> class nama_kelas { access_specifier: // data_members dan member_f unctions Berikut ini disajikan dua buah contoh program yang masing-masing akan menunjukkan pendefinisian sebuah template fungsi dan template kelas dengan menggunakan kata kunci typename. a. Mendefinisikan template fungsi Apabila kita amati bahwa hasil yang ditampilkan berupa data menurun. Hal ini disebabkan dalam stack yang diambil pertama kali adalah data yang berada pada posisi paling atas. Anda dapat bayangkan pada saat Anda mencuci piring dan menumpuknya. Firing yang dicuci terlebih dahulu tentunya akan berada pada posisi paling bawah dan jika piring-piring tersebut diambil satu per satu, maka piring yang pertama diletakkan tentu akan diambil paling akhir. Begitu juga dengan stack, data yang ditempatkan (push) paling awal akan diambil (pop) paling akhir. Hal ini sering dikenal dengan sebutan LIFO (Last In First Out) Template Menggunakan Kata Kunci typename Selain menggunakan kata kunci class untuk mendefinisikan sebuah template (fungsi maupun kelas), kita juga dapat menggunakan kata kunci typename yang telah disediakan oleh C + +. Adapun bentuk umum dari pendefinisian template dengan menggunakan kata kunci typename adalah sebagai T Tntuk pendefinisian template fungsi template <typename T> tipe_data nama_fungsi(parameterl, parameter^, ; { Statemen_yang_akan_dilakukan; Pemrograman #include <iostream> Kode Program 18-1 template <typename TIPEKU> int TambahSatu(TIPEKU X) return (X+l); cout«tambahsatu (1.12) «endl ; cout«tambahsatu(49) «endl; return ; Hasil yang akan diberikan dari program di atas adalah sebagai Mendefinisikan template kelas tinclude <iostream> template <typename TIPEKU> class CONTOH { ; TIPEKU X; public: CONTOH{TIPEKU XX) { X = XX; } void TampilkanXO { cout«x«endl; } }; V Bab 18: Template

44 int main() :ONTOH <HR A(1)^ CONTOH <char*> B("Saya sangat menyukai C++"); A.TampilkanXO ; B.Tampi BAB 19 NAMESPACE return Hasil yang akan diberikan dari program di atas adalah sebagai 1 Saya sangat menyukai C Keuntungan Template Walaupun telah dikemukakan di atas, namun secara umum template dapat memberikan banyak keuntungan bagi kita, di antaranya : Menghemat penulisan kode program karena dengan adanya template maka kita tidak melakukan pengulangan dalam penulisan kode Dapat digunakan untuk kebutuhan-kebutuhan lain dalam berbagai situasi karena template dapat digunakan untuk berbagai tipe data Dapat menambah fleksibilitas program 19.1 Pendahuluan Namespace adalah sebuah fitur yang telah dikenalkan pada C+ + standar, tepatnya pada tahun Pada bagian ini kita akan membahas mengenai apa itu namespace dan mengapa fitur tersebut perlu ditambahkan ke dalam bahasa C + +. Untuk dapat lebih mudah dalam memahami namespace, sebelumnya coba Anda bayangkan apabila data pada komputer Anda tidak memiliki direktori ataupun sub direktori sama sekali, dan semua file disimpan ke dalam sebuah repositori (tempat penyimpanan) saja. Apa yang akan Anda rasakan? Hal ini tentu akan menimbulkan banyak masalah, mulai dari penamaan file yang tidak boleh sama antara file yang satu dengan yang lain, susah dalam pencarian file maupun banyak lagi masalah-masalah lainnya. Namun, dengan adanya direktori maupun sub-sub direktori, kita dapat menempatkan file sesuai dengan kelompoknya masingmasing. Kita dapat menyimpan file dengan nama yang sama persis di dalam beberapa direktori yang berbeda tanpa harus terjadi penimpaan isi dari file-file bersangkutan. Konsep dari pembuatan namespace di dalam C++ sebenarnya mirip sekali dengan contoh kasus di atas. Namespace dibuat untuk menghindari timbulnya konflik penamaan variabel, konstanta, nama fungsi dan nama kelas. Untuk itu, namespace berguna sekali apabila digunakan untuk Bab 19: Namespace

45 menyelesaikan program-program besar yang memiliki kompleksitas yang tinggi. Artinya, program akan dipecah atau dikelompokkan berdasarkan namespace-namespace yang berlainan. Sebagai contoh, misalnya kita akan membuat program yang didalamnya menggunakan dua buah library atau header file standar (tanpa menggunakan namespace), katakanlah library A dan B. Dalam kasus ini kita tidak dapat membuat fungsi, kelas maupun variabel dengan nama yang sama di dalam kedua buah library tersebut, alasannya adalah karena terdapat adanya duplikasi nama. Namun dengan menggunakan namespace, hal ini bisa saja dilakukan. Melalui contoh-contoh program yang ada pada bab ini diharapkan Anda akan memahami dengan baik konsep namespace dan dapat mengimplementasikannya ke dalam kebutuhan program yang sedang Anda hadapi sendiri Mendefinisikan Namespace Untuk mendefinisikan sebuah namespace di dalam program C+ +, kita hams menggunakan kata kunci namespace. Berikut ini bentuk umum pendefinisiannya. space nama_namespace { deklarasi yang akan dilakukan Dari bentuk umum di atas dapat kita amati bahwa namespace sebenarnya adalah sebuah lingkup (scope) program dimana semua variabel, konstanta, fungsi maupun kelas yang dideklarasikan di dalamnya hanyalah dapat dikenali di dalam lingkup tersebut saja. Apabila kita akan memanggilnya dari luar lingkup, maka kita perlu menyertakan nama dari namespace-nya dan dengan bantuan operator scope resolution (::). Perhatikan contoh pendefinisian namespace berikut ini. // mendefinisikan namespace A lamespace A { / mendeklarasikan sebuah variabel int x; // mendeklarasikan sebuah fungsi cetakx( -// A void cetakxo { cout«"nilai x di dalam namespace A : di dalam namespace Pada kode di atas kita mendefinisikan sebuah namespace dengan nama A yang didalamnya memiliki dua buah deklarasi, yaitu variabel x dan fungsi cetakx (). Sama seperti layaknya sebuah member function di dalam kelas, dalam namespace kita juga diizinkan untuk memisahkan bagian deklarasi dan definisi dari sebuah fungsi, yaitu dengan menggunakan operator scope resolution (::). Dengan demikian, untuk contoh di atas, kodenya dapat dituliskan seperti namespace A { int x; void cetakx(); A: : cetakx ( } { cout«"nilai x di dalam namespace A Mungkin sebagian dari Anda akan bertanya bagaimana cara untuk mendeklarasikan kelas di dalam sebuah namespace? Berikut ini contoh sintaks yang akan menunjukkan hal tersebut. namespace B { class contoh { private: int bilangan; public : void setbilanganfint nilai) bilangan = nilai; I } int getbilangan ( ) { return bilangan; Kode di atas menunjukkan bahwa kita mendeklarasikan sebuah kelas dengan nama contoh di dalam namespace B Menggunakan Namespace Setelah Anda mengetahui cara mendefinisikan sebuah namespace, maka hal selanjutnya yang perlu dipahami adalah bagaimana cara untuk menggunakannya di dalam program. Dengan kata lain, bagaimana kita dapat mengakses variabel, konstanta, fungsi maupun kelas yang dideklarasikan dalam sebuah namespace. Bab 19: Namespace

46 Terdapat dua buah cara untuk melakukan hal ini, yaitu dengan menggunakan operator scope resolution (: :) dan menggunakan kata kunci using. Berikut ini penjelasan dari masing-masing cara tersebut Menggunakan Operator Scope Resolution (::) Untuk dapat memanggil variabel, konstanta, fungsi maupun kelas yang terdapat di dalam sebuah namespace, kita dapat menggunakan operator : :, yaitu dengan cara seperti di bawah ini. Berikut ini contoh program yang akan menunjukkan penggunaan operator : : kaitannya dengan namespace. #in usi Nilai x di dalam namespace A : 1 Nilai x di dalam namespace A : 2 Tampak pada kode di atas bahwa kita dapat melakukan pemanggilan variabel x dari fungsi utama atau fungsi main () dengan menggunakan A: : x. Mula-mula kita isikan nilai ke dalam variabel x dengan nilai 1. Selanjutnya pada baris berikutnya kita memanggil fungsi setx () dengan menggunakan A: : setx (2). Ini artinya kita mengubah nilai x menjadi 2 sehingga pada saat nilai tersebut dipanggil lagi dengan perintah A: : getx (), maka yang akan ditampilkan adalah nilai x terakhir, yaitu 2. Selanjutnya, di sini kita akan membahas bagaimana cara menggunakan kelas yang terdapat di dalam namespace. Namun sebelumnya, coba Anda perhatikan terlebih dahulu contoh program berikut ini. #include <iostream> it main () // mengakses dan mengisikan nilai x yang terdaj // di dalam namespace A A::x = 1; cout«"nilai x di dalam namespace A : "«A: :x«endl; // memanggil fungsi setx{) yang terdapat di dalam namespace A A::setx(2); '/ memanggil fungsi getx{) yang terdapat di dalam namespace A :out«"nilai - x di dalam namespace A : "«A: :getx{ }«endl; retui Apabila dijalankan, program di atas akan memberikan hasil seperti Pemrograman namespace NS { class Titik { private: f,... int x;,, int y; public: void setkoordinat(int nilaix, int nilaiy) { x = nilaix; y = nilaiy; void geservertikal (int deltay) { y += deltay; } void geserhorisontal (int deltax) { x += deltax; void cetakkoordinat ( ) { cout«" Koordinat : ( " «x«", " «y«" ) " «endl, // Melakukan instansiasi kelas Titik Bab 19: Namespace

47 JS::Titik A; // mengeset nilai koordinat awal L.setKoordinat(2, 5); ucetakkoordiriat () ; // menggeser 2 nilai ke bawah..geservertikal (-2) ; :out«" \nsetelah digeser 2 nilai ke bawah..cetakkoordinat () ; // menggeset 3 nilai ke kanan i.geserhorisontal (3) ; cout<-:" \nsetelah digeset 3 nilai k k. cetakkoordinat () return ; Hasil yang akan diberikan dari program di atas adalah sebagai Koordinat: (2, 5) Setelah digeser 2 nilai ke bawah Koordinat : (2, 3) Setelah digeser 3 nilai ke kanan Koordinat: (5, 3) Perhatikan kembali kode: Maksud dari kode di atas adalah mendeklarasikan objek A yang mengacu ke kelas Titik yang terdapat pada namespace NS. Setelah melakukan instansiasi objek di atas, maka kita dapat memanggil member function yang terdapat pada kelas Titik melalui objek A Menggunakan Kata Kunci using Sebelum kita membahas lebih jauh mengenai penggunaan kata kunci using, coba Anda perhatikan terlebih dahulu contoh program sederhana di bawah ini. Pemrograman C+^ #include <iostream> Kode Program 19-3 I int bilangan; std::cout«"masukkan sebuah bilangan bulat: "; std: :cin»bilangan; std: :cout«"bilangan yang Anda masukkan adalah "«std: :endl return ; } Dapat kita lihat pada contoh kode di atas bahwa kita menggunakan cout, cin dan endl yang semuanya berada di dalam namespace std (namespace yang telah disediakan oleh kompiler C++). Di sini kita menggunakan operator scope resolution (::) setiap kali melakukan pemanggilan terhadap cout, cin maupun endl. Sekarang coba Anda bayangkan apabila di dalam program yang kita buat terdapat banyak sekali penggunaan cout, cin maupun endl? Apakah kita akan selalu menuliskannya dengan cara std: : cout, std: : cin maupun std: : endl? Hal ini tentu akan sangat merepotkan. Maka dari itu, untuk meningkatkan efisiensi kode program yang kita tulis, C++ menyediakan kata kunci using untuk memberikan solusi atas masalah seperti ini. Terdapat dua buah cara untuk menggunakan kata kunci using, yaitu sebagai using nama namespace::member; dan using namespace nama _ namespace/ Berikut ini penjelasan dari masing-masing bentuk di atas. Bentuk pertama digunakan apabila kita hanya akan menggunakan sebuah anggota (member) namespace saja. Sebagai contoh, apabila di dalam program yang kita buat kita hanya akan menggunakan cout saja (tanpa menggunakan cin dan endl), maka kita dapat menuliskannya seperti berikut. // mengatakan kepada kompiler bahwa kita akan menggunakan cout using std: : cout; : ^p^^ jf^ ^^^^^H^^ra^^^^BwJHBHllH Dengan menuliskan kode di atas, maka kita tidak perlu lagi menuliskan std:: cout untuk melakukan pemanggilan cout. Bab 19: Namespace

48 Untuk lebih memperjelas, berikut ini program yang akan memmjukkan konsep dari hal tersebut. // mengambil sebuah nilai dari stack int,pop() { if (atas < ) { cout«"stack kosong"«endl; return ; } else { return A[atas--]; I Tampak bahwa setelah kita mendaftarkan cout dengan kata kunci using, maka kita tidak perlu lagi menuliskan std: : cout di dalam program. Adapun contoh lain yang dapat kita ambil untuk menunjukkan konsep dari penggunaan kata kunci using bentuk pertama adalah sebagai berikut. using NSStack::Stack; Stack ob; int i ; // meletakkan nilai ke dalam sta for (i=; i<1; ob.push(i+l); g std::endl; amespace NSStack { lass Stack { private: int *A; int atas; public: constructor Stack() { A = new int[1 atas = -1; ' destructor >tack( delete f] A; / meletakkan sebuah ni oid push(int nilai) if (atas == 9) { cout«" Stack penuh"«endl; } else { A[++atas] = nilai; Pemrograman C+^ // mengambil nilai dari dalam stack for (i = ; i<1; i++) { cout«ob. pop () «endl ; Hasil yang akan diberikan oleh program di atas adalah sebagai berikut Dapat kita lihat bahwa pada kode di atas, kita mendeklarasikan objek ob dengan kode berikut. Bab 19: Namespace

49 Hal ini dapat dilakukan SStack::Stack; yang berarti bahwa kita akan menggunakan kelas Stack yang terdapat di dalam namespace NSStack. Coba Anda perhatikan kembali kode berikut ini yang terdapat pada contoh program di atas. Jttd ; :i;p Kode tersebut akan mengatakan kepada kompiler bahwa kita akan menggunakan cout dan endl yang terdapat pada namespace std. Sekarang coba Anda bayangkan kembali apabila kita akan menggunakan semua member yang terdapat pada namespace std, apakah kita akan melakukan penulisan kode seperti di atas? Jawabnya tentu tidak. Di saat seperti inilah kita memerlukan penggunaan kata kunci using bentuk kedua, yaitu dengan cara menuliskan kode Melalui kode tersebut, berarti kita sudah dapat menggunakan semua member yang terdapat pada namespace std Namespace Tanpa Nama Terdapat tipe namespace khusus yang hanya dapat digunakan di dalam satu buah file saja, namespace ini disebut dengan namespace tanpa nama (unnamed namespace) atau sering pula dinamakan dengan anonymous namespace. Adapun bentuk umum untuk mendefinisikan namespace jenis ini adalah sebagai namespace { ' deklarasi yang akan dilakukan Pada C + + klasik, untuk melakukan keperluan ini kita hanya dapat menggunakan ruang penyimpanan statik, yaitu dengan menggunakan kata kunci static. Sebagai bahan perbandingan, coba Anda perhatikan terlebih dahulu dua buah contoh kode di bawah ini. Pemrograman CH File Pertama stat-ic int j ; int fungsil() { j = 1; // Benar File Kedua extern int j,- int fungsi2() j = 2; // Salah Pada file kedua kita tidak dapat menggunakan variabel j karena sebenarnya variabel tersebut tidak benar-benar didefinisikan di dalamnya. Dalam C++ standar, kita dapat menggantinya dengan menggunakan namespace tanpa nama, sehingga kodenya akan berubah menjadi seperti di bawah ini. File Pertama namespace { int j ; int fungsil () { j = 1; // Benar File Kedua extern int j,- int fungsi2() j = 2; // Salah Meskipun C++ standar masih memperbolehkan kita untuk menggunakan kata kunci static untuk keperluan seperti di atas, namun penggunaan namespace lebih direkomendasikan Alias Namespace Apabila nama space terlalu panjang atau rumit, maka kita diizinkan juga untuk membuat alias untuk namespace tersebut dengan nama yang pendek sehingga akan mudah dalam penggunaannya. Definisi alias itu sendiri adalah suatu nama lain atau nama julukan. Jadi, membuat alias namespace bukan berarti membuat namespace baru, melainkan membuat nama baru untuk alias yang kita maksudkan. Berikut ini bentuk umum untuk membuat alias namespace. namespace nama alias = nama.namespace/ Perhatikan kode di bawah ini. namespace ContohNamespacePanjang { int j; Bab 19: Namespace

50 eturn A[atas--]; // membuat alias namespace di atas dengan namespace CNP = ContohNamespacePanjang; Pada contoh kode di atas kita melihat bahwa kita membuat alias dari namespace ContohNamespacePanjang dengan nama CNP sehingga kita dapat menggunakan namespace tersebut dengan menggunakan kode using CNP: :*j ; atai 3ing nam- Untuk lebih memaharninya, coba Anda perhatikan kembali contoh program berikut ini dimana didalamnya terdapat sebuah pembuatan nama alias namespace. Kode Program 19-6 //fungsi untuk mencetak semua void cetakstack(stack ob) { int temp; while ((temp = ob.popo) 1=) { cout«temp«endl; //membuat alias namespace ContohNamespacePanjang //dengan nama CNP namespace CNP = ContohNamespacePanjang; //menggunakan namespace CNP using namespace CNP; r Stack S; int i ; for (i=; i<1; S.push( (i+1) * 1) ; cetakstack(s) ; return ; menambahkan item ke dalam stack id push ( int..nilai) { if (atas == 9} { cout«" Stack penuh"«endl; } else { A[++atas] = nilai; '/mengambil item dari dalam stack Lnt pop() { if (atas < ) return ; } else { Tampak pada program di at-as, bahwa setelah kita membuat alias namespace ContohNamespacePanjang dengan nama CNP, maka kita dapat menggunakan alias tersebut seperti layaknya kita menggunakan namespace ContohNamespacePanjang. Dengan kata lain, setelah melakukan penulisan kode using namespace CNP; ^-- : '' ':..' maka kita dapat menggunakan kelas Stack dan fungsi cetakstacko yang terdapat pada namespace ContohNamespacePanjang. Adapun hasil yang akan diberikan dari program di atas adalah sebagai 1 9 Bab 19: Namespace

51 Memecah Namespace Bila kita bekerja dengan banyak file, maka kita bisa saja membagi atau memecah namespace menjadi beberapa bagian, tentunya dengan nama yang sama. Berikut ini contoh kode yang akan menunjukkan konsep tersebut. File Pertama namespace A { int i ; File Kedua namespace A { int j ; Dapat kita lihat bahwa pada file pertama kita mendefinisikan namespace A, begitu juga dengan file kedua. Hal ini tetap diperbolehkan oleh C + +. Bahkan, dalam satu file pun kita bisa memecah namespace menjadi beberapa bagian. Sebagai bukti dari pernyataan ini, coba Anda perhatikan contoh program berikut ini. # include <iostream> Kode Program 19-7 '// mendefinisikan namespace A bagian pertama namespace A { int i ; // mendefinisikan namespace A bagian kedua namespace *? A { int j ; Pemrograman //menggunakan operator A: :i = 1; A: :j = 2; '/menggunakan kata kunci using ising namespace A; i = 3; j = 4; cout«"menggunakan kata kunci using"«enco cout«i * j«endl; return ; Di sini, kita hanya bekerja dengan satu file, namun kita memecah namespace A menjadi dua bagian dan ini tidak menimbulkan masalah pada saat program dikompilasi. Adapun hasil yang akan diberikan oleh program di atas adalah sebagai Menggunakan operator :: 2 Menggunakan kata kunci using Namespace Bersarang Satu hal yang perlu sekali untuk diperhatikan dalam penggunaan namespace adalah bahwa namespace tidak dapat didefinisikan di dalam lingkup (scope) program lainnya. Sebagai contoh, kita tidak dapat mendefinisikan namespace baru di dalam sebuah fungsi, blok pengulangan maupun lingkup program lainnya. Meskipun demikian, terdapat satu perkecualian, namespace dapat didefinisikan di dalam namespace lainnya. Hal ini sering dinamakan dengan namespace bersarang (nested namespace). Berikut ini contoh program yang akan menunjukkan bagaimana namespace dapat didefinisikan di dalam namespace lainnya. Bab 19: Namespace

52 ttinclude <iostream> Kode Program set nilai i dan j. = 1; // Benar :j = 2; // Salah )alam::j = 2; // Benar //menggunakan namespace Luar using namespace Luar; 3; // Benar //j = 4; // Salah Dalam::j = 4; // Benar : "«Luar: : i«endl ; : "«Luar: :Dalam: : j«endl«endl; cout«"nilai i : "«i«endl; cout«"nilai j : "«Dalam: : j«endl«endl; //menggunakan namespace Dalam using namespace Dalam; i = 5; // Benar j =6; // Benar,/return ; Apabila dijalankan, program di atas akan memberikan hasil seperti Nilai i: 1 Nilai j : 2 Nilai i: 3 Nilai j : 4 Nilai i : 5 Nilai j : 6 Pada kode di atas kita mendefinisikan namespace Dalam di dalam namespace Luar. Ini artinya, apabila kita ingin menggunakan namespace Dalam kita dapat menuliskan kode using namespace Luar::Dalam; Sedangkan apabila kita hanya ingin menggunakan variabel j di dalam namespace Dalam, maka kita dapat menuliskannya seperti using namespace Luar::Dalam::j; Atau apabila kita ingin menggunakan namespace yang terdapat pada namespace Luar dan Dalam secara sekaligus maka kita perlu menuliskan dua baris kode using namespace Luar;,:, :^;: // Benar. using namespace Dalam; // Benar Kode di atas harus kita tuliskan secara berurutan, karena apabila dituliskan seperti di bawah ini using namespace Dalam; using namespace Luar; //Salah // Benar maka ini akan menimbulkan masalah, alasannya adalah karena namespace Dalam tidak dikenali. Kenapa tidak dikenali? Hal ini disebabkan karena namespace Dalam didefinisikan di dalam namespace Luar. Sehingga apabila kita tetap ingin menuliskan urutan tersebut, maka kita harus mengubah kodenya menjadi seperti di bawah ini. using namespace Luar: :Dalam; // Benar using namespace Luar; // Benar 19.8 Namespace std Dalam C++ standar, semua library yang digunakan berada di dalam sebuah namespace yang dinamakan dengan std. Inilah alasannya mengapa pada C++ standar (juga dalam buku ini), semua program mengandung kode Bab 19: Namespace

53 Hal tersebut tentu akan jauh lebih memudahkan kita dalam menggunakan semua member yang terdapat pada namespace std. Seperti yang telah kita kemukakan sebelumnya, begitu repotnya bila kita hams menggunakan operator : : setiap kali kita akan memanggil atau menggunakan member dari namespace std. Cara lain yang dapat digunakan untuk mendaftarkan member dari namespace std adalah dengan mendaftarkan member tersebut satu persatu, misalnya dengan menggunakan kode using std: :cout; HHHHHB BAB 2 TOPIK LANJUT LAINNYA Mungkin Anda akan bertanya mana yang sebaiknya harus digunakan, cara pertama atau cara kedua? Hal ini tentu kembali kepada konteks program yang sedang Anda hadapi. Artinya apabila program yang Anda buat hanya akan menggunakan beberapa member dari namespace std, Anda dapat menggunakan cara kedua. Bentuk kedua ini biasanya digunakan oleh para programmer C++ profesional yang memahami lebih dalam mengenai seluruh isi yang ada di dalam namespace std. Namun, untuk memudahkan, bagi para pemula biasanya direkomendasikan untuk menggunakan cara pertama. 2.1 Pendahuluan Setelah mempelajari dan memahami semua konsep yang dikemukakan dari bab 1 sampai 19, maka kini saatnya Anda melengkapi kemampuan C++ Anda dengan mengenai konsep tingkat lanjut yang bakal banyak Anda jumpai pada programprogram riil. Dengan menyelesaikan dan memahami semua materi yang terdapat dalam buku ini, berarti Anda telah mempersiapkan diri Anda untuk menjadi seorang Master C + +, tentunya dengan latihan yang keras dan selalu berusaha untuk mengembangkan kemampuan Anda. Pada bab ini akan dibahas mengenai topik-topik lanjut yang sering digunakan. Memang antara sub bab yang satu dengan yang lain di dalam bab ini sama sekali tidak memiliki hubungan, namun ini akan sangat bermanfaat bagi Anda dalam proses pengembangan program. Pemrograman Bab 2: Topik Lanjut Lainnya

54 2.2 Fungsi Konversi Dalam beberapa situasi, terkadang kita ingin menggunakan objek di dalam sebuah ekspresi dan memasukkannya ke dalam variabel dengan tipe data lain. Dalam keadaan normal, tentu hal ini tidak dapat dilakukan. Maka dari itu, untuk mengatasi masalah seperti ini, kita dapat melakukannya dengan salah satu cara, yaitu dengan menggunakan fungsi konversi. Melalui cara ini, sebuah objek dapat dianggap sebagai tipe data lain dan dapat digunakan sebagaimana layaknya tipe data tersebut. Sebuah fungsi konversi harus didefinisikan di dalam kelas yang akan dikonversi. Adapun bentuk umum dan pendefinisiannya adalah sebagai Pada bentuk umum di atas, tipe_data adalah tipe data yang akan digunakan sebagai tujuan konversi, dan nilai_kembalian adalah nilai dari kelas setelah dilakukan proses konversi. Tipe data dari nilai_kembalian harus sama dengan tipe_data. Fungsi konversi hanya mengizinkan satu buah nilai kembalian, dan juga tidak boleh mengandung parameter. Meskipun demikian, fungsi konversi bisa saja bersifat virtual sehingga dapat di-override pada kelas-kelas turunan. Untuk lebih memahami konsepnya, perhatikan contoh program di bawah ini dimana kita akan membuat sebuah kelas Stack yang dapat digunakan di dalam sebuah ekspresi bilangan bulat (integer). Pada contoh ini, anggaplah kelas Stack yang akan kita buat hanya mampu menampung 1 buah nilai (item) bertipe int. Selanjutnya, apabila kita memasukkan tipe Stack ke dalam tipe int, maka tipe Stack tersebut akan mengembalikan jumlah nilai (item) yang saat ini ada di dalam stack. Berikut ini kode yang dimaksud. Mnclude <iostream> const int MAX = 1; class Stack { int A[MAX]; int atas; Kode Program 2-1 ablic: Stack() { atas =! // jumlah stack mula-mula // meletakkan sebuah nilai ke dalam stack void push(int nilai) { if (atas == MAX) { cout«" Stack penuh"«endl; } else { A[atas++] = nilai; } // mengambil sebuah nilai dari stack int pop() { if (atas < ) { cout«"stack kosong" «endl; return ; } else { return A[--atas]; // fungsi konversi dari tipe Stack ke tipe i operator int() { return atas; Stack ob; int i, jumlah; : for (i=; i<6; ob.push(i+l); jumlah = ob; // konversi dari tipe Stack ke tipe int cout«"jumlah maksimal stack : "«MAX«endl; ;cout«" Jumlah item yang telah diisikan : "«jumlah«endl, fcout«" Jumlah sisa ruang di dalam stack : "; cout«max - jumlah«endl«endl; // menampilkan isi stack cout«"isi stack :"«endl; for (i=; i<6; i++) { cout«ob.pop () «" "; return ; Bab 2: Topik Lanjut Lainnya

55 Hasil yang akan diberikan oleh program di atas adalah sebagai Jumlah maksimal stack Jumlah item yang telah diisikan Jumlah sis a ruang di dalam stack Isi stack : : 1 :6 :4 Pada kode di atas tampak bahwa kita menuliskan kode i = ob; Kita mengetahui bahwa ob merupakan sebuah objek dari kelas Stack, sedangkan jumlah adalah variabel yang bertipe int. Namun, dengan mendefinisikan fungsi konversi di atas maka kita dapat memasukkan nilai ob ke dalam variabel jumlah. 2.3 Mengenal const Member Function dan mutable Dalam C+ +, fungsi-fungsi yang terdapat di dalam suatu kelas dapat dideklarasikan sebagai konstanta. Hal ini akan menyebabkan pointer this akan dijadikan sebagai pointer konstan. Dengan demikian, fungsi tersebut tidak diizinkan untuk melakukan perubahan terhadap data-data yang terdapat di dalam kelas bersangkutan. Untuk mendeklarasikan fungsi sebagai fungsi konstan, maka kita harus menggunakan kata kunci const di belakang nama fungsi bersangkutan. Berikut ini contoh program yang akan menunjukkan pendeklarasian fungsi konstan dan cara kerjanya. Sebagai catatan, pada saat kompilasi, program berikut akan menimbulkan kesalahan. #include <iostream> Kode Program 2-2 Pemrograman public: void setx(int nilai} x = nilai; // Sa int getx() const { return x; // Benar p = new Contoh; p->setx(3); cout«"nilai x di dalam kelas Contoh "«p->getx ( return BMMHHMBMI Perhatikan kode di dalam kelas Contoh, di situ terlihat bahwa kita mendeklarasikan dua buah fungsi konstan, yaitu setx() dan getx (). Pada saat kompilasi, kompiler akan memunculkan pesan error yang menyatakan bahwa fungsi setx() adalah fungsi konstan sehingga tidak diperbolehkan untuk mengubah nilai x. Sedangkan fungsi getx () tetap bisa dijalankan karena didalamnya hanya memanggil nilai x. Pada prakteknya, untuk kasus-kasus tertentu terkadang kita memerlukan beberapa buah fungsi di dalam suatu kelas yang dideklarasikan sebagai fungsi konstan. Terdapat suatu perkecualian, apabila kita memang benar-benar ingin mengubah data dari fungsi konstan, maka data tersebut harus dideklarasikan menggunakan kata kunci mutable. Perhatikan contoh program di bawah ini yang merupakan perbaikan dari contoh program sebelumnya. ^include <iostream> class Contoh { mutable int x; publi C: void setx(int nilai) const { Bab 2: Topik Lanjut Lainnya Kode Program 2-3

56 x - nilai; // Bena int getx() const { return x; // Benar string getnlpo const { return NIP; void setnama(string _nama) { nama =,_nama ; string getnama() const { return nama; void setumur(short int _umur) umur = umur; lilai x di dalam kelas Contoh : "«p->getx{ int getumur() const { return umur; void setgaji (double _gaji) const gaji = _gaji; Kali ini, program dapat dijalankan karena x dideklarasikan sebagai mutable member. Jadi, kesimpulannya adalah kita dapat mengubah suatu data dalam suatu kelas dari fungsi konstan apabila data tersebut bersifat mutable. Hal ini sering dijumpai pada kasus dimana kita memiliki banyak data dalam suatu kelas yang seharusnya bersifat konstan, namun terdapat satu atau beberapa data lain yang memang dapat diperbaharui. Sebagai contoh, dalam kelas Karyawan, kita memiliki data konstan seperti NIP, nama dan umur serta sebuah data yang sewaktu-waktu dapat berubah, misalnya gaji. Dari kasus ini, kita dapat implementasikan ke dalam bentuk program seperti di bawah ini. #include <iostream> #include <cstring> #include <iomanip> class Karyawan { private: string NIP; string nama; short int umur; mutable double gaji; public: void setnip(string _NIP) { NIP = _NIP;: Pemrograman ; double getgaji return gaji; // Fungsi utama int main ( ) { Karyawan obi, ob2 ; const { obi. setnlp ( " 13. Ill.1" obi. setnama ( "M. Aryoseno " obl.setumur(25) ;" obi. setgaji (4) ; cout«"nip : "«obl.getnip()«endl; : cout«"nama : "«obl.getnama( )«endl; cout«"umur : "«obl.getumur (} «endl; :cout«"gaji : "«setprecision(8)«obl.getgaji ()«endl«enc Ob2. setnip ( "13. Ill. 2 ") ; ob2. setnama ( "Rizki Dwi Mulyana" ) ; ob2.setumur(26) ; ob2. setgaji (5) ; cout«"nip : "«ob2.getnip()«endl; cout«"nama : "«ob2,getnama( ) «endl; cout«"umur : "«ob2.getumur ( )«endl; cout«"gaji : "«setpreci,sion(8)<<ob2.getgaji()«endl; return ; Hasil yang akan diberikan oleh program di atas adalah sebagai Bab 2: Topik Lanjut Lainnya

57 NIP : Nama : M. Aryoseno Umur : 25 Gaji : 4 NIP : Nama : Rizki Dwi Mulyana Umur : 26 Gaji : 5 Perhatikan kembali fungsi setgajio di atas. Fungsi tersebut dideklarasikan sebagai fungsi konstan, tujuannya adalah untuk meyakinkan bahwa fungsi tersebut tidak dapat melakukan modifikasi nilai terhadap data NIP, nama dan umur. Namun, karena fungsi setgaji() tersebut harus dapat mengubah nilai dari data gaji, maka data gaji harus dideklarasikan sebagai mutable member. 2.4 Mengenal Copy Constructor Selain constructor standar seperti yang telah kita bahas pada bab sebelumnya, dalam C + + juga dilengkapi dengan sebuah fitur untuk melakukan pembuatan copy constructor. Kegunaan dari copy constructor itu sendiri adalah untuk menginisialisasi suatu objek dari objek lainnya. Pada saat kita menggunakan objek sebagai parameter fungsi (yang dilewatkan berdasarkan nilainya) dan sebagai nilai kembalian dari suatu fungsi, secara internal kompiler akan membuat objek baru lokal di dalam fungsi bersangkutan yang merupakan salinan (copy) dari objek yang dilewatkan tersebut. Proses penyalinan semacam ini sering dinamakan dengan bitwise copy. Meskipun bitwise copy dapat digunakan secara sempurna dalam banyak kasus, namun ada kalanya kita harus menghindari penggunaannya. Contoh yang paling umum mengapa kita harus menghindarinya adalah apabila di dalam constructor objek yang akan kita buat terdapat sebuah proses pengalokasian memori. Sebagai contoh, apabila terdapat kelas dengan nama CONTOH yang harus mengalokasikan sebuah memori di dalam constructor-nya, dan terdapat sebuah objek A yang merupakan instance dari kelas tersebut. Ini artinya, objek A telah mengalokasikan sebuah rnemori. Selanjutnya, anggaplah bahwa objek A akan digunakan untuk melakukan inisialisasi terhadap objek baru B, yaitu dengan menggunakan kode CONTOH B = A; Apabila di sini kita menggunakan bitwise copy, maka objek B merupakan salinan pasti dari objek A. Artinya, objek B akan menggunakan bagian memori yang sama seperti yang sedang digunakan oleh objek A, dan tidak mengalokasikan ruang memori baru untuk keperluannya sendiri. Singkatnya, ini tidak sesuai dengan apa yang kita harapkan. Masalah lainnya adalah, apabila di dalam kelas CONTOH terdapat proses desctructor yang akan membebaskan ruang memori yang telah dipesan pada saat constructor objek. Hal ini tentu akan menyebabkan satu buah memori yang sama akan dibebaskan (free) sebanyak dua kali, yaitu pada saat destructor objek A dan destructor objek B, dan ini akan menjadi masalah yang serius. Seperti yang sempat disinggung sebelumnya, masalah yang sama juga akan muncul pada saat kita menggunakan objek tersebut sebagai parameter atau nilai kembalian dari sebuah fungsi. Untuk mengatasi masalah tersebut, C++ mengizinkan kita untuk membuat sebuah copy constructor, yang memiliki bentuk umum pembuatan seperti nama_kelas (const nama_kelas &ob) { // Jbadan constructor } WBwm Di sini, ob adalah sebuah reference ke objek yang akan dijadikan sumber penyalinan (bukan objek tujuan) dalam proses inisialisasi. Jadi apabila terdapat kode CONTOH B = A; :,,,, ;;,-*v;f.. V maka ob adalah sebuah reference yang mengacu ke objek A. Perlu sekali untuk dicatat bahwa parameter pertama dari sebuah copy constructor harus berupa reference ke objek. Meskipun demikian, kita dapat menambahkan parameter ke dalamnya sebagai parameter kedua, ketiga dan seterusnya, selama parameter tersebut memiliki nilai default. Bab 2: Topik Lanjut Lainnya

58 Sebuah copy constructor akan dipanggil pada saat proses-proses yang merupakan inisialisasi. Sebagai contoh, apabila kita memiliki kelas CONTOH dan fungsi f unc (), dan A adalah objek dari kelas tersebut, maka statemen-statemen berikut akan melakukan pemanggilan terhadap copy constructor. Berikut ini contoh program sederhana yang akan menunjukkan bagaimana sebuah copy constructor bekerja. // fungsi untuk mendapatkan nilai berdasarkan indeks int ambilnilai(int indeks) { return p[indeks]; // definisi copy constructor array::array(const array &ob) { int i ; try { p = new int [ob.ukuran],- } catch (bad alloc e) { cout«"alokasi memori gagal dilakukan' exit(exit_failure); // melakukan penyalinan isi array for (i=; i < ob.ukuran; i++) { p[i] = ob.p[i]; class array { int *p; int ukuran; public: // constructor default array(int _ukuran) { try { p = new int[_ukuran]; } catch (bad_alloc e) { cout«"alokasi memori gagal dilakukan' exit(exit_failure); // Fungsi utama 4nt main() { memanggil constructor default // mengisikan nilai ke dalam array A for (j=; j<1; j++) { A.isiNilai ( j, j+1) ; (standar) // menampilkan nilai yang terdapat di dalam array A cout«"nilai di dalam array A: "«endl; for (j=; j<1; j++) { cout«a. ambilnilai ( j ) «" " ; cout«endl«endl ; fungsi untuk memasukkan nilai ke dalam array d isinilai{int indeks, int nilai) f ((indeks < ukuran) && (nilai p[indeks] = nilai; else { cout«"nilai gagal dimasukkan"; // melakukan inisialisasi terhadap array B menggunakan arr^ // A array B(A); // memanggil copy constructor // menampilkan nilai yang terdapat di dalam array B cout«"nilai di dalam array B: "«endl; for (j=; j<1; j++) { cout«b. ambilnilai (j )«" " ; } return ; Bab 2: Topik Lanjut Lainnya i

59 Hasil yang akan diberikan adalah sebagai Nilai di dalam array A: Nilai di dalam array B: Tampak jelas pada contoh program di atas bahwa kita melakukan penyalinan nilai dari objek A ke dalam objek B melalui sebuah copy contructor, yaitu dengan menuliskan kode Ini artinya, pada saat copy constructor dipanggil, maka akan dialokasikan 1 buah ruang memori baru untuk tipe integer dan disimpan ke dalam pointer B.p (pointer milik objek B), dan semua nilai yang terdapat di dalam objek A akan disalin (di-copy) ke objek B. Dalam hal ini, objek A dan B akan berisi nilai yang sama, tapi sebenarnya masing-masing nilai dari kedua buah objek tersebut akan berada pada ruang memori yang terpisah. Dengan kata lain, pointer p milik dari objek A (A. p) dan pointer p milik dari objek B (B. p) tidak akan menunjuk ke alamat memori yang sama. Maka dari itu, apabila destructor dari objek A dipanggil maka hal ini tidak akan menyebabkan masalah terhadap objek B, begitu juga sebaliknya. Namun seandainya kita tidak membuat sebuah copy constructor, maka yang akan terjadi adalah proses bitwise copy sehingga A. p dan B. p akan menunjuk ke alamat memori yang sama. Sebagai catatan terakhir yang perlu diingat adalah bahwa copy constructor tidak berlaku atau tidak akan dipanggil pada proses assignment. Sebagai contoh, perhatikan contoh kode array A(1);I array B(1); A = B; tidak akan memanggil copy constructor Di sini, A B merupakan sebuah proses assignment, dan copy constructor tidak akan dipanggil. Artinya yang akan dilaksanakan adalah bitwise copy. Sebenarnya, untuk masalah seperti ini, apabila kita ingin memanggil copy constructor, maka kita harus melakukan overload terhadap operator = di dalam kelas bersangkutan. Pemrograman 2.5 Mengenal Constructor Eksplisit Menurut keadaan default, ketika kita melewatkan satu buah parameter pada constructor suatu kelas maka sebenarnya secara implisit kita melakukan konversi dari tipe data parameternya menjadi tipe kelas. Seperti yang telah dijelaskan pada bab sebelumnya dalam buku ini, bahwa kita dapat melakukan inisialisasi nilai dari sebuah objek (misalnya dengan nama ob) pada saat instansiasi melalui dua buah cara, yaitu dengan menuliskan ob(x) atau ob = x. Di sini, artinya secara implisit tipe dari variabel x akan dikonversi ke tipe kelas. Untuk lebih memahaminya, coba Anda perhatikan contoh program di bawah ini. ttinclude <iostream> class contoh { int nilai; public: contoh(int x) int getnilai() { return nilai; int main(} { contoh ob = 1; cout«ob.getnilai () «endl; return ; Kode Program 2-6 otomatis akan dikonversi ke contoh(1) Di sini, constructor dari kelas contoh memiliki sebuah parameter yang bertipe int. Seperti yang dapat Anda lihat pada kode di atas bahwa kita dapat melakukan inisialisasi nilai terhadap objek ob dengan cara contoh ob = 1; // bentuk Ini artinya, secara implisit terjadi konversi dari tipe data parameter ke tipe kelas, yaitu dari tipe int ke tipe contoh. Pada saat kita menuliskan kode tersebut, sebenarnya secara otomatis kompiler Bab 2: Topik Lanjut Lainnya

60 akan memanggil fungsi constructor contoh () dengan melewatkan nilai 1 ke dalamnya. Dengan demikian, kode di atas akan sama bila dituliskan seperti contoh ob(1); // bentuk kedua Meskipun demikian, C + + mengizinkan kita untuk mematikan konversi otomatis tersebut sehingga kita hanya diperbolehkan menggunakan sintaks normal constructor (seperti yang terlihat pada bentuk kedua di atas). Adapun caranya adalah dengan mendeklarasikan constructor tersebut sebagai constructor eksplisit, yaitu dengan menambahkan kata kunci explicit di depan nama constructor bersangkutan. Berikut ini contoh program yang akan menunjukkan konsep constructor eksplisit. Kode Program 2-7 // constructor eksplisit explicit contoh(int x) : nilai(x) { getnilai(} 2turn nilai nt main() { contoh ob(1); //contoh ob = 1; cout«ob. getnilai return ; // Benar // Salah, tidak diizinkan oleh kompilei Tampak pada kode di atas bahwa dengan menambahkan kata kunci explicit di depan constructor, maka kita tidak dapat menuliskan instansiasi objek dengan menggunakan kode contoh ob = 1; Pemrograman 2.6 Membuat File Header Pada prakteknya, apabila Anda kelak akan mengembangkan program menggunakan C+ +, tentu Anda akan bekerja dengan banyak file. Artinya, Anda tentu akan memecah fungsi-fungsi di dalam program yang Anda buat menjadi beberapa file terpisah sesuai dengan kategorinya. Fungsi-fungsi yang dituliskan dalam file lain ini biasa disebut dengan fungsi eksternal. Dalam C++, file yang berisi fungsi-fungsi eksternal tersebut akan disimpan ke dalam file header (file yang memiliki ekstensi.h). Sebelum kita memulai pembahasan mengenai cara pembuatan file header, perlu Anda ketahui terlebih dahulu bahwa C++ memiliki dua buah tipe language linkage, yaitu "C+ + " dan "C". Linkage "C" digunakan apabila Anda akan membuat file header dengan menggunakan bahasa C, namun file tersebut akan digunakan atau dipanggil oleh program yang ditulis dalam bahasa C + +. Sedangkan linkage "C+ + " digunakan untuk pemanggilan kode C++ secara native, artinya file header dan program pemanggilnya sama-sama ditulis dalam bahasa C+ +. Penulisan linkage "C + + " ini bersifat opsional (bisa disertakan, bisa juga tidak) karena secara default setiap kompiler C++ akan menganggap bahwa linkage yang digunakan adalah linkage "C+ + ". Untuk menggunakan linkage tersebut, kita harus menuliskan kata kunci extern di depannya. Pada bagian ini kita akan mencoba untuk membuat dua buah file header, yaitu dengan menggunakan bahasa C dan C+ +. Sedangkan program pemanggilnya akan kita tulis dalam bahasa C + +. Hal ini bertujuan agar Anda benar-benar memahami perbedaan yang ada antara linkage " C" dan " C + +" Menggunakan Bahasa C Untuk membuat file header dengan menggunakan bahasa C, ikuti langkah-langkah berikut ini. 1. Buatlah file.h (misalnya dengan nama myheaderl.h) dan isikan contoh kode di bawah ini. extern "C" int jumlah(int a, int b); :extern "C" int kali(int a, int b); extern "C" double bagi(double a, double b); Bab 2: Topik Lanjut Lainnya

61 extern "C" void cetaklnteger(int nilai); extern "C" void cetakdouble(double nilai); Buatlah file dengan nama myheaderl. c (sesuai dengan nama file yang kita buat pada Langkah 1), selanjutnya isikan kode di bawah ini. #include <stdio.h> extern "C" int jumlah(int a, int b) { return a + b; jxtern "C" int kali(int a, int b) { return a * b; double = bagi(1, 3, // menampilkan hasil per. cetaklnteger(x); cetaklnteger(y cetakdouble(z return ; Hasil yang akan diperoleh adalah sebagai extern "C" void cetaklnteger(int nilai) { printf("%d\n", nilai); extern "C" void cetakdouble(double nilai) { printf("%.21f\n", nilai); 3. Lakukan kompilasi terhadap file myheaderl. c (bukan dijalankan). Sampai di sini, kita sudah memperoleh file header yang siap untuk digunakan di dalam program. Sekarang, untuk melakukan pengujian terhadap file header yang baru saja kita buat di atas, buatlah contoh program pemanggil (dalam bahasa C++), misalnya dengan nama mainl. cpp. Adapun kodenya adalah sebagai #include <iostream> #include "myheaderl.h" Kode Program 2-8 // menggunakan file-header myheaderl.h // menggunakan fungsi-fungsi di dalam file myheaderl.h int x = jumlahdo, 3); int y = kali (1, 3); HHHHHHHHH Pemrograman C Menggunakan Bahasa C++ Setelah mengetahui dan memahami bagaimana cara pembuatan file header dengan bahasa C, sekarang kita akan membahas tentang pembuatan file header dengan menggunakan bahasa C+ +. Adapun cara-caranya adalah sebagai 1. Buatlah kembali file.h (misalnya dengan nama myheader2. h) dan isikan kode berikut ke dalamnya. extern "C++" int jumlah(int a, int b) ; extern "C++" int kali (int a, int b) ; extern "C++" double bagi (double a, double b) ; extern "C++" void cetak(int nilai); extern "C++" void cetak (double nilai) ; 2. Buat file.cpp dengan nama myheader2. cpp dan isikan kode seperti di bawah ini. #include <iostream> finclude <iomanip> extern "C++" int jumlah(int a, int b) { return a + b; extern "C++" int kali (int a, int b) { return a * b; extern "C++" double bagi (double a, double b) Bab 2: Topik Lanjut Lainnya us

62 return a / b extern "C++" voi cout«nilai«endl; ext c id cetak(double nilai) { ision (3) «showpoint«nilai«er Lakukan kompilasi terhadap file myheader2. cpp. Selanjutnya, seperti biasa, buatlah sebuah program pemanggil (misalnya dengan nama main2. cpp) yang akan menggunakan file myheader2. h. Adapun contoh kodenya adalah sebagai double z cetak(x); cetak(y); cetak(z); return ; BAGIAN IV LATIN AN SOAL Hasil yang akan diberikan adalah sama seperti pada saat kita membuat file header dengan menggunakan bahasa C. Seperti yang Anda lihat pada kedua buah contoh di atas, bahwa pada saat kita membuat file header dengan menggunakan bahasa C, maka yang digunakan adalah linkage "C". Begitu juga pada saat menggunakan bahasa C+ +, maka linkage yang digunakan adalah "C+ + "..

63 BAB 21 LATIHAN SOAL I class Luar { public: int x ; class Dalam public: char y; Dalam obi; Luar ob2; // kode yang akan dituliskan return ; Berdasarkan kode di atas, manakah yang menyebabkan kesalahan (error) pada saat proses kompilasi? A. Kelas tidak dapat didefinisikan di dalam kelas lain B. Deklarasi objek obi seharusnya berada setelah deklarasi ob2 C. Kelas Luar dan Dalam tidak memiliki member function D. Deklarasi objek obi seharusnya menggunakan Luar::Dalam E. Tidak satupun kelas memiliki destructor enum { merah, biru, hijau=5, birutua=biru, hitarn, kuning Berapa nilai numerik dari dihasilkan untuk hi tarn? A. B. C. D. E. enumerasi di atas yang akan Bab 2: Latihan Soal 1

64 LAMPIRAN BAGIAN IV LATIHAN SOAL A. Kata Kunci dalam C++ Kata kunci (keyword) adalah suatu kata yang telah tersedia dalam kompiler. Kita tidak dapat menggunakannya sebagai nama variabel, konstanta, fungsi maupun nama kelas di dalam kode program yang kita tulis. Adapun beberapa kata kunci yang terdapat dalam C + + adalah seperti terlihat di bawah ini. auto break case catch char class const continue default delete do double else enum extern float for friend goto if int long mutable new operator private protected public register return short signed sizeof static struct switch template this throw typedef union unsigned virtual void volatile while B. Bilangan Biner dan Heksadesimal C++ mengizinkan kita untuk melakukan penulisan kode assembly ke dalam program yang ditulis dengan bahasa C + +, ini dinamakan dengan inline assembly, yang dapat dilihat pada lampiran C dalam buku ini. Sedangkan dasar-dasar untuk mengetahui pengkodean dalam bahasa assembly, kita perlu mengetahui konsep konversi Lampiran

65 bilangan dalam basis-basis tertentu. Di sini kita akan membahas mengenai cara melakukan konversi antar basis tersebut. 1. Basis Basis adalah suatu ilmu yang tentu pernah Anda dapatkan sebelumnya dalam pelajaran matematika di bangku sekolah. Namun, sebagai penyegaran di sini akan dibahas kembali dengan tujuan agar Anda dapat benar-benar memahami konsep yang terdapat di dalamnya. Adapun istilah untuk penamaan basis adalah sebagai beikut: Bilangan dalam basis 2 akan disebut dengan bilangan biner Bilangan dalam basis 8 akan disebut dengan bilangan oktal Bilangan dalam basis 1 akan disebut dengan bilangan desimal Bilangan dalam basis 16 akan disebut dengan bilangan heksadesimal Apabila kita mempunyai bilangan 15 dalam basis 1 (bisa ditulis dengan 15 1 ), maka dalam basis 8 kita akan menuliskan bilangan tersebut dengan Sebenarnya jika kita amati mengapa dalam basis 1 dituliskan 15 untuk merepresentasikan nilai lima belas. Ini artinya bahwa dalam bilangan lima belas terdapat 1 puluhan dan 5 satuan, maka dituliskan 15. Begitu juga dalam basis 8, dalam nilai lima belas terdapat 1 delapan-an dan 7 satuan sehingga ditulis Apabila nilai tersebut kita konversi ke dalam basis 9, maka akan ditulis Sedangkan dalam basis 7 akan ditulis Mungkin Anda bingung, kenapa 21? Bukan 18. Alasannya adalah dalam bilangan lima belas terdapat 2 bilangan tujuh-an dan 1 satuan sehingga akan ditulis Bilangan Biner Bilangan biner adalah bilangan yang dituliskan dalam basis 2. Terdapat dua buah bilangan yang digunakan dalam merepresentasikan nilai untuk tiap bit di dalam basis 2, yaitu dan 1. Istilah 'bit' akan dijelaskan pada bagian selanjutnya dalam lampiran ini. Berikut ini tabel yang menunjukkan nilai yang terdapat pada basis 2 (untuk 8 bit). T 26 Bilangan Biner (Basis 2) Dan seterusnya Bilangan Desimal (Basis 1) Dan seterusnya Sebagai contoh, jika kita ingin melakukan konversi bilangan 88 (basis 1) ke dalam bentuk biner (basis 2), maka langkah-langkah yang harus dilakukan adalah : a b. c. d e Lampiran Ketahui terlebih dahulu kolom dan nilai yang ada pada basis 2, seperti Nomor Kolom Perpangkatan Nilai Selanjutnya kita lihat bahwa tidak terdapat 128-an pada bilangan 88, maka kolom ke-8 kita isikan. Terdapat satu 64-an pada bilangan 88 sehingga kolom ke-7 kita isikan 1. Sisa bilangan yang ada adalah 24 (berasal dari 88-64). Tidak terdapat 32-an pada bilangan 24, maka kolom ke-6 kita isikan. Terdapat satu 16-an pada bilangan 24 sehingga kolom ke-5 kita isikan 1. Sisa bilangan yang ada adalah 8 (berasal dari 24-16)

66 f. Terdapat satu 8-an pada bilangan 8 sehingga kolom ke-4 kita isikan 1. Sisa bilangan yang ada adalah. Hal ini berarti kolom-kolom selanjutnya juga kita isikan. Dari langkah-langkah yang telah kita lakukan, kita menemukan bentuk biner dari bilangan 88 adalah 111. Mungkin sekarang Anda akan bertanya, bagaimana cara melakukan konversi dari bilangan biner ke dalam bilangan desimal? Caranya sederhana sekali, karena kita hanya mengalikan bilangan tiap digit tersebut dengan nilai kolom yang ada. Sebagai contoh kita akan melakukan konversi bilangan 111 ke bentuk desimal, maka langkah yang harus dilakukan adalah sebagai x!28 1 X x 1 X 1 X x x x Desimal Bilangan Heksadesimal Bilangan heksadesimal adalah bilangan yang dituliskan dalam basis 16. Dalam basis 16, terdapat 16 buah bilangan, yaitu seperti yang terlihat pada tabel Heksadesimal Desimal Sebagai contoh jika kita mempunyai bilangan biner , dan kita ingin melakukan konversi bilangan tersebut ke dalam bentuk heksadesimal, maka langkah-langkah yang harus dilakukan adalah sebagai a. 1, bentuk desimalnya adalah 8, maka dalam bentuk heksadesimal adalah A 1 B 11 C 12 D 13 E 14 F 15 Pemrograman O b. 111, bentuk desimalnya adalah 1, maka dalam bentuk heksadesimal adalah A c. 1, bentuk desimalnya adalah 4, maka aalam bentuk heksadesimal adalah 4 d. 1111, bentuk desimalnya adalah 15, maka dalam bentuk heksadesimal adalah F Jadi hasil dari konversi bilangan biner ke dalam bilangan heksadesimal adalah 8A4F. 4. Bit, Byte dan Nybble Bit adalah singkatan dari binary digit (digit biner) yang dapat kita representasikan dengan satu buah kotak yang digunakan untuk menempatkan nilai 1 atau. Sedangkan byte adalah satuan yang digunakan untuk data yang akan disimpan ke dalam memori, dimana 1 byte sama dengan 8 bit. Setengah dari 1 byte (1/2x8 bit = 4 bit) disebut dengan istilah nybble. 5. Kilobyte dan MegaByte Dalam dunia komputer, istilah 'kilo' bukan berarti 1, melainkan 124 desimal. Angka ini (124) didapat dari 2 1. Begitu juga dengan istilah 'mega', artinya bukan 1, melainkan yang berasal dari 2 2 (atau 2 1 x 2 1 ). Hal ini berarti bahwa 1 kilobyte (1 KB) sama dengan 124 byte dan 1 megabyte (1 MB) sama dengan byte. C. Inline Assembly Inline assembly adalah suatu kumpulan perintah yang ditulis dengan bahasa assembly dan dimasukkan ke dalam program C + +. Adapun proses kompilasi programnya pun tidak perlu menggunakan assembler lagi (misalnya TASM) karena C++ secara otomatis akan mengenali perintah-perintah tersebut. Sebenarnya, penjelasan mengenai inline assembly di sini lebih ditujukan bagi Anda yang sebelumnya banyak bekerja (memogram) dengan Lampiran

67 bahasa assembly. Dengan adanya kemampuan seperti ini, maka para programmer assembly yang sebelumnya harus melakukan pengkodean (coding) yang cukup panjang, tentu dapat lebih menyingkat programnya karena mereka hanya akan memasukkan bagian-bagian tertentu saja ke dalam kode assembly, sisanya ditulis dalam bahasa C + +. Untuk melakukan pembuatan inline assembly ini, C + + telah menyediakan sebuah kata kunci yang berfungsi untuk membuat scope dari kode-kode yang ditulis dalam bahasa assembly. Adapun kata kunci yang dimaksud adalah kata kunci asm. Terdapat dua cara yang perlu diperhatikan untuk menggunakan kata kunci ini, yaitu : Kita dapat menuliskan inline assembly dimana setiap baris perintahnya diawali dengan kata kunci asm dan diakhiri dengan tanda semicolon / titik koma (';') Bias any a cara ini digunakan untuk single statement. 2. Membuat inline assembly dengan cara seperti pembuatan fungsi di dalam C + +, yaitu dengan diawali oleh kata kunci asm yang diikuti tanda {, dan diakhiri dengan tanda }. Namun perlu sekali untuk diperhatikan bahwa pada cara ini penulisan kata kunci asm dan tanda { harus berada pada baris yang sama. Berikut ini contoh program C++ yang didalamnya terdapat inline assembly. Program di bawah ini akan ditulis dalam dua cara di atas. Adapun contoh yang akan kita gunakan adalah membuat kode program dalam bahasa assembly yang berfungsi untuk memindahkan kursor ke posisi tertentu. Hal ini sama seperti halnya fungsi gotoxyq yang terdapat di dalam C + + (dalam Turbo C + + ). Sebenarnya hal ini tidak perlu dilakukan dalam bahasa assembly karena C + + telah menyediakan fungsi untuk kebutuhan ini, namun untuk membuktikan bahwa C++ mampu untuk mengenali instruksi yang ditulis dalam bahasa assembly, maka di sini kita akan menuliskannya ke dalam bahasa assembly. Pada program pertama kita akan menggunakan cara penulisan yang pertama. Adapun sintaks programnya adalah seperti yang GOTOXY(int X, int Y) { asm mov ah, asm mov dl, asm mov dh, asm mov bh, int 1h; // Fungsi utama / Memanggil fungsi GOTOXY GOTOXY(12, 6); c ou t«"mengungkap Rahas i a C++ return ; Apabila dijalankan program di atas akan menampilkan teks 'Mengungkap Rahasia C+ + " pada posisi baris ke-6 dan kolom Posisi ini tentunya akan ditentukan oleh nilai yang dilewatkan sebagai parameter pada saat pemanggilan fungsi GOTOXY () tersebut. Kita lihat bahwa pada program di atas terdapat kata kunci asm di setiap baris kode yang ditulis dalam bahasa assembly. Hal ini tentu tidak efisien apabila kode yang akan kita masukkan ternyata cukup Untuk mengatasi hal ini, maka kita akan menuliskan program di atas dengan inline assembly dengan cara yang kedua. Adapun sintaks programnya adalah seperti yang tertulis di bawah ini. #inlcude <iostream.h> ajj void GOTOXY(int X, int Y) asm { : mov ah, 2h; mov dl, X; mov dh, mov bh, Y; ; int 1h; int main{) { GOTOXY(12, 6); cout«"mengungkap Rahasia C+ return ; #include <iostream.h> // Membuat fungsi GOTOXY menggunakan bahasa assembly Lampiran

68 D. C++ Bagi Programmer Java Bagi Anda yang telah biasa melakukan pemrograman dengan bahasa Java tentu Anda tidak akan banyak mengalami kesulitan jika Anda mencoba untuk menulis program dengan bahasa C+ +. Hal ini dikarenakan Java adalah suatu bahasa turunan dari bahasa C++ sehingga Java banyak mengadopsi kata kunci yang terdapat dalam C+ +. Walaupun demikian, suatu bahasa pemrograman tentu akan mempunyai karakteristik tersendiri untuk melakukan manipulasi kode di dalamnya. Pada bagian ini akan dijelaskan beberapa persamaan dan perbedaan yang paling tampak antara C++ dan Java. Komentar Program Dalam C++ kita menggunakan tanda /*...*/ dan // untuk membuat sebuah komentar program, begitu juga dengan bahasa Java. C + + dan Java menggunakan jenis komentar /*... */ yang merupakan gaya komentar dari bahasa C untuk memberi komentar yang banyaknya lebih dari satu baris. Sedangkan jenis // digunakan untuk komentar yang banyaknya satu baris. 2. Struktur dan Union Bahasa Java tidak mendukung adanya struktur dan union seperti yang dapat kita lakukan di dalam bahasa C Array Pembuatan array di dalam bahasa Java hampir mirip dengan pembuatan array di dalam bahasa C+ +. Perbedaan yang paling terlihat adalah sebagai Bahasa Java memperbolehkan tanda [ ] ditulis di depan atau di belakang nama array, sedangkan di dalam C++ tanda tersebut hams ditulis di belakang nama array. Sebagai contoh, berikut ini adalah pendeklarasian array di dalam bahasa Java. Pemrograman Dalam pendeklarasiannya, bahasa Java tidak perlu menuliskan jumlah elemen sedangkan di dalam C++ kita harus menulikannya (kecuali untuk tipe char). 4. Preprocessor Directive Bahasa Java tidak mendukung adanya preprocessor directive. Dengan demikian dapat dikatakan bahwa program yang ditulis dengan C atau C++ tentu akan lebih kompleks dibandingkan kita menggunakan bahasa Java. Kita tahu bahwa preprocessor directive adalah fitur C/C + + yang dapat menambah fleksibilitas program. Sebagai contoh dalam bagian ini, kita tidak dapat menggunakan #def ine di dalam program Java. 5. Pointer Apabila kita membuat program dengan bahasa C+ +, kita tidak akan terlepas dari penggunaan pointer untuk proses pengaturan memori. Namun, bahasa Java tidak mendukung pointer. Java telah memberikan otomatisasi dalam proses tersebut. Dengan menggunakan bahasa Java kita tidak perlu pusing untuk mengalokasikan dan mendealokasikan memori. 6. Kelas Untuk mendefinisikan sebuah kelas di dalam bahasa Java, kita harus tetap menuliskan tingkat akses (access specifier) untuk semua data dan fungsi, sedangkan dalam C++ kita dapat menyingkatnya dengan satu buah access specifier yang diikuti tanda titik dua (:). Untuk lebih memahaminya, berikut ini contoh pendefinisian kelas di dalam bahasa Java. class-siswa { private int NIM; private String Nama; ;private String Alamat; private String Kota; Apabila ditulis dengan C + +, maka sintaks di atas akan menjadi seperti berikut. Lampiran

69 lass SISWA { rivate: int NIM; char Nama[25] char Alama char Kota[ Namun, untuk kasus ini sebenarnya statemen private: di atas tidak perlu dituliskan karena secara default, C++ akan menganggapnya sebagai private sehingga sintaks di atas dapat juga dituliskan sebagai berikut. class SISWA { int NIM;' char Nama[2 [ char Alamat char Kota[ ; : Multiple Inheritance Bahasa Java tidak mendukung adanya multiple inheritance yang biasanya kita lakukan dalam program C+ +. Artinya di dalam bahasa Java kita tidak dapat membuat satu kelas baru yang diturunkan dari dua buah objek atau lebih secara langsung. E. C++ Bagi Programmer Pascal Bagi Anda yang sebelumnya telah mempelajari bahasa Pascal, di sini akan diberikan beberapa bahan perbandingan agar Anda mudah dalam melakukan konversi dari bahasa Pascal ke dalam C Identifier Dalam bahasa Pascal, identifier juga dibedakan menjadi dua yaitu konstanta dan variabel. Namun yang perlu sekali untuk diperhatikan bahwa bahasa Pascal tidak membedakan penulisan huruf kecil dengan huruf besar (bersifat incasesensitive), hal ini tentu berbeda dengan C+ +. Berikut ini contoh pendeklarasian yang dilakukan dalam bahasa Pascal. { Membuat ko const PI = 3.14; {Mendeklarasikan variabel var X : integer; Karakter : char; Teks : string[1]; Jika kita menggunakan C + +, maka pendeklarasian di atas dapat dituliskan dengan sintaks seperti di bawah ini. const float PI, = int X; : char KARAKTER; char Teks[1]; 2. Struktur Apabila kita menggunakan bahasa Pascal, pembuatan struktur harus menggunakan kata kunci record. Berikut ini contoh pembuatan dan penggunaannya di dalam bahasa Pascal. { Membuat tipe data struktur } type STRUKTUR = record NIM : logint; Nama : string[25]; Kota : string[15] ; end; { Mendeklarasikan variabel A dan B dengan tipe STRUKTUR } var A, B : STRUKTUR; HHHHHfcHBBI Sedangkan jika kita terjemahkan sintaks tersebut ke dalam bahasa C+ +, maka penulisannya harus seperti di bawah ini. typedef struct STRUKTUR { long NIM; char Nama[25]; char Kota [15],- STRUKTUR A, B; HHBHI Atau dapat juga disingkat penulisannya dengan menggunakan sintaks berikut. Lampiran

70 typedef S u.ct STRUKTUR { long NlliT char Nama[25]; char Kota[15]; } A, B;! 3. Pointer Dalam bahasa Pascal, untuk menentukan tipe pointer kita menggunakan operator ^ di depan tipe data yang akan ditunjuk, sedangkan untuk mendapatkan alamat dari sebuah variabel, operator yang digunakan adalah Selanjutnya untuk membuat dereference pointer kita akan menuliskan tanda ^ di belakang nama pointer. Berikut ini contoh pendeklarasian sebuah pointer di dalam bahasa Pascal. ^^^^^ var X : integer; P : ^integer; jgin P := 2; writeln('nilai dari P A : l, P A ); : writeln('nilai dari X : ', X); end. Apabila diterjemahkan dalam bahasa C- sintaksnya menjadi seperti di bawah ini. Lnt main () { int X; int *P; P = &X; *P = 2; cout«"nilai dari *P cout«"nilai dari X return 4. Array : "«*P«endl; : "«X«endl; maka penulisan Dalam bahasa Pascal, apabila kita ingin menggunakan array sebagai tipe data, maka kita akan menuliskannya seperti berikut. A : array[1..5] of char; B : LARIK; begin { kode yang akan dituliskan } end. Apabila sintaks di atas diterjemahkan ke dalam bahasa C + +, maka sintaksnya akan menjadi seperti di bawah ini. typedef int LARIK[2][3]; char A[5]; LARIK B; // kode yang akan ditulis return ; 5. Fungsi Dalam bahasa Pascal dikenal dua buah modul, yaitu fungsi dan prosedur. Sedangkan di dalam C++ hanya dikenal istilah fungsi. Namun, mungkin Anda bertanya, bagaimana jika kita akan membuat prosedur di dalam C + +? Jawabnya adalah dengan cara mendefinisikan nilai balik dari fungsi tersebut dengan nilai void. Berikut ini contoh pembuatan prosedur dan fungsi di dalam bahasa Pascal. procedure TULIS (str : string) ; begin writeln(str) ; end; function KALI2 (x : integer) : integer; end; KALI2 '.:= x * 2; Apabila sintaks tersebut kita terjemahkan ke dalam bahasa C+ +, maka sintaksnya akan menjadi seperti berikut ini. void. TULIS (char* str) { cout«str«end; int KALI2 (int x) { return (x*2) ; LARIK = array [1.. 2, 1..3] of integer; var Pemrograman C Lampiran

71 6. Overload Fungsi Untuk melakukan penimpaan (overloading) fungsi atau prosedur di dalam bahasa Pascal, kita menggunakan kata kunci overload di belakang nama fungsi atau prosedur yang akan ditimpa. Berikut ini "ontoh proses overload fungsi di dalam bahasapascaj.. il(x, y : integer) : integer; ove BAG id; Dalam C + +, sintaks tersebut akan ditulis seperti berikut. BAGI(int x, int y) { return (x/y);.oat BAGI{float return (x/y); \ a Instalasi MinGW Developer Studio di dalam Microsoft Windows Untuk memulai instalasi software MinGW Developer Studio di dalam Micrososft Windows, jalankan file installer MinGWStudioFullSetupPlus-2.exe, sehingga akan muncul tampilan wizard seperti jjf MinGW Developer Studio 2.5 Setup Welcome to the MinGW Developer Studio 2.5 Setup Wizard This wizard will guide you through the installation of MinGW Developer Studio 2.5. It is recommended that you close all other applications before starting 5etup, This will allow Setup to update certain system files without rebooting your computer. Click Next to continue. F. Instalasi dan Penggunaan MinGW Developer Studio Agar memudahkan Anda dalam mempelajari semua kode program yang dijelaskan di dalam buku ini, maka buku ini disertai juga dengan CD yang berisi sebuah IDE dan kompiler C + + yang mudah digunakan serta telah mendukung bahasa C++ standar. Sowtware tersebut adalah MinGW Developer Studio. Di sini, kita akan menggunakan versi 2.5. Pada lampiran ini akan dijelaskan bagaimana cara melakukan instalasi software tersebut, baik untuk sistem operasi Microsoft Windows maupun Linux. Selain itu, akan dijelaskan juga bagaimana cara penggunaannya sehingga Anda dapat melakukan penulisan program di dalamnya dengan mudah. Next > Cancel Klik Next untuk melanjutkan. Tampilan berikutnya form untuk persetujuan lisensi dalam penggunaan software, yaitu seperti Pemrograman Lampiran

Komentar, Identifier, Konstanta dan Variabel

Komentar, Identifier, Konstanta dan Variabel PEMROGRAMAN BERORIENTASI OBJEK Komentar, Identifier, Konstanta dan Variabel Budhi Irawan, S.Si, M.T KOMENTAR PROGRAM Dalam proses pengembangan sebuah program, pasti akan disibukan dengan penulisan kode-kode

Lebih terperinci

FAKULTAS TEKNIK UNIVERSITAS NEGERI YOGYAKARTA LABSHEET ALGORITMA DAN STRUKTUR DATA

FAKULTAS TEKNIK UNIVERSITAS NEGERI YOGYAKARTA LABSHEET ALGORITMA DAN STRUKTUR DATA Hal 1 dari 12 A. KOMPETENSI 1. Mampu membuat komentar dalam kode program 2. Memahami konstanta, variabel dalam C++ 3. Mampu membuat inisialisasi nilai ke dalam variabel B. ALAT DAN BAHAN 1. PC/ Laptop

Lebih terperinci

PEMROGRAMAN BERORIENTASI OBJEK

PEMROGRAMAN BERORIENTASI OBJEK PEMROGRAMAN BERORIENTASI OBJEK Fungsi Budhi Irawan, S.Si, M.T 10/27/2017 9:12:31 AM 1 PENDAHULUAN Fungsi merupakan kumpulan statemen yang dikelompokan menjadi satu bagian kode (blok program) untuk menyelesaikan

Lebih terperinci

PEMROGRAMAN BERORIENTASI OBJEK. Operator. Budhi Irawan, S.Si, M.T

PEMROGRAMAN BERORIENTASI OBJEK. Operator. Budhi Irawan, S.Si, M.T PEMROGRAMAN BERORIENTASI OBJEK Operator Budhi Irawan, S.Si, M.T OPERATOR Operator adalah tanda yang digunakan untuk melakukan operasi operasi tertentu didalam program. Dengan adanya operator maka dapat

Lebih terperinci

Pointer dan Referensi

Pointer dan Referensi PEMROGRAMAN BERORIENTASI OBJEK Pointer dan Referensi Budhi Irawan, S.Si, M.T PENDAHULUAN Pointer merupakan salah satu fitur C++ yang relatif cukup berbahaya karena dapat mengakibatkan sistem operasi pada

Lebih terperinci

Konsep Dasar Pemrograman Dan Pengenalan C++

Konsep Dasar Pemrograman Dan Pengenalan C++ PRAKTIKUM 1 DAN 2 Konsep Dasar Pemrograman Dan Pengenalan C++ I. KONSEP DASAR PEMROGRAMAN Program adalah deretan instruksi yang digunakan untuk mengendalikan komputer, sehingga komputer dapat melakukan

Lebih terperinci

PEMROGRAMAN BERORIENTASI OBJEK. Pengulangan. Budhi Irawan, S.Si, M.T

PEMROGRAMAN BERORIENTASI OBJEK. Pengulangan. Budhi Irawan, S.Si, M.T PEMROGRAMAN BERORIENTASI OBJEK Pengulangan Budhi Irawan, S.Si, M.T PENGULANGAN Pengulangan adalah suatu proses yang melakukan perulangan statement-statement dalam sebuah program secara terus-menerus sampai

Lebih terperinci

PEMROGRAMAN BERORIENTASI OBJEK OBJECT

PEMROGRAMAN BERORIENTASI OBJEK OBJECT PEMROGRAMAN BERORIENTASI OBJEK OBJECT Budhi Irawan, S.Si, M.T OBJEK SEBAGAI PARAMETER DALAM SEBUAH FUNGSI Dalam C++, objek dapat juga berperan sebagai parameter dalam pendefinisian sebuah fungsi. Objek

Lebih terperinci

SUMBER BELAJAR PENUNJANG PLPG

SUMBER BELAJAR PENUNJANG PLPG SUMBER BELAJAR PENUNJANG PLPG 2017 [TIK] BAB VIII PEMROGRAMAN BERORIENTASI OBJEK [Alfa Faridh Suni] KEMENTERIAN PENDIDIKAN DAN KEBUDAYAAN DIREKTORAT JENDERAL GURU DAN TENAGA KEPENDIDIKAN 2017 BAB VIII

Lebih terperinci

KELAS DAN OBJEK KELAS

KELAS DAN OBJEK KELAS KELAS DAN OBJEK KELAS Adalah bentuk penyederhanaan dari suatu permasalahan yang berkaitan dengan objek yang digunakan untuk merepresentasikan sebuah objek tertentu sehingga akan membantu dalam proses penyelesaian

Lebih terperinci

FAKULTAS TEKNIK UNIVERSITAS NEGERI YOGYAKARTA LABSHEET ALGORITMA DAN STRUKTUR DATA

FAKULTAS TEKNIK UNIVERSITAS NEGERI YOGYAKARTA LABSHEET ALGORITMA DAN STRUKTUR DATA Hal 1 dari 8 A. KOMPETENSI 1. Memahami pengertian kelas dan objek 2. Mampu mendefinisikan kelas 3. Mampu mendeklarasikan objek 4. Memahami constructor dan destructor B. ALAT DAN BAHAN 1. PC/ Laptop 2.

Lebih terperinci

SOAL C++ Created by Yuli Astuti,S.Kom Copyright 2009

SOAL C++ Created by Yuli Astuti,S.Kom Copyright 2009 SOAL C++ 1. Penulisan Preprocessor yang benar di awali dengan tanda pound atau tanda : a. # c. @ b. & d. = 2. Contoh penulisan file header yang benar yaitu : a. &include c. =include

Lebih terperinci

Keg. Pembelajaran 2 : Mengenal Bahasa C++

Keg. Pembelajaran 2 : Mengenal Bahasa C++ Keg. Pembelajaran 2 : Mengenal Bahasa C++ 1. Tujuan Kegiatan Pembelajaran Setelah mempelajari materi kegiatan pembelajaran ini mahasiswa akan dapat : 1) Mengenal secara baik sintak-sintak dalam bahasa

Lebih terperinci

PEMROGRAMAN BERORIENTASI OBJEK. Tipe Data. Budhi Irawan, S.Si, M.T

PEMROGRAMAN BERORIENTASI OBJEK. Tipe Data. Budhi Irawan, S.Si, M.T PEMROGRAMAN BERORIENTASI OBJEK Tipe Data Budhi Irawan, S.Si, M.T TIPE DATA Tipe Data berfungsi untuk merepresentasikan jenis dari nilai yang terdapat dalam program. Contoh apabila mempunyai suatu data

Lebih terperinci

Pengenalan C++ Oleh : Dewi Sartika

Pengenalan C++ Oleh : Dewi Sartika Pengenalan C++ Oleh : Dewi Sartika Pendahuluan Bahasa Pemrograman C++ merupakan bahasa tingkat menengah dimana bahasa ini didasarkan atas bahasa C, keistimewaan dari bahasa C++ adalah bahasa ini mendukung

Lebih terperinci

SL 1201 Materi tentang Fungsi

SL 1201 Materi tentang Fungsi SL 1201 Materi tentang Fungsi Program merupakan kumpulan dari fungsi-fungsi baik yang didefinisikan langsung maupun yang disimpan dalam file header. Dalam program C++ selalu terdapat fungsi utama yang

Lebih terperinci

Kurikulum Qt. Chapter 4 Function. Fungsi

Kurikulum Qt. Chapter 4 Function. Fungsi Chapter 4 Function Fungsi Fungsi (Function) adalah sekumpulan program yang diberi nama, sehingga dengan demikain jika program itu diperlukan dapat dipanggil kembali. Walaupun Pemrograman Berorientasi Objek

Lebih terperinci

Pemrograman I Bab III Tipe Data, Variabel, dan Operasi Perhitungan. Adam Mukharil Bachtiar, S.Kom. Universitas Komputer Indonesia

Pemrograman I Bab III Tipe Data, Variabel, dan Operasi Perhitungan. Adam Mukharil Bachtiar, S.Kom. Universitas Komputer Indonesia Pemrograman I Bab III Tipe Data, Variabel, dan Operasi Perhitungan Adam Mukharil Bachtiar, S.Kom. Universitas Komputer Indonesia Tipe Data 1. Tipe data karakter 2. Tipe data bilangan bulat 3. Tipe data

Lebih terperinci

Bab 2. Dasar-Dasar Pemrograman C

Bab 2. Dasar-Dasar Pemrograman C Bab 2. Dasar-Dasar Pemrograman C Konsep Pemrograman Politeknik Elektronika Negeri Surabaya 2006 Overview Tipe Data Standar (Standart Data Type) Aturan Pendefinisian Identifier Variabel Mendeklarasikan

Lebih terperinci

Tipe Data, Identifier, Operator dan Control Statement

Tipe Data, Identifier, Operator dan Control Statement Kurikulum Qt { Basic OOP } Chapter 2 Tipe Data, Identifier, Operator dan Control Statement. Agenda Tipe data dan identifier Tipe data bahasa C++ Variabel dan Konstanta Statement Operator dan Ekspresi Control

Lebih terperinci

PEMROGRAMAN BERORIENTASI OBJEK STRUCTURE & CLASS

PEMROGRAMAN BERORIENTASI OBJEK STRUCTURE & CLASS PEMROGRAMAN BERORIENTASI OBJEK STRUCTURE & CLASS Budhi Irawan, S.Si, M.T PENDAHULUAN Dalam C++, struktur dan kelas adalah dua hal yang sebenarnya saling memiliki hubungan, artinya dapat dibuat kelas dengan

Lebih terperinci

Tipe bentukan dan pointer selanjutnya akan kita pelajari pada modul pemrograman 1 (akhir semester).

Tipe bentukan dan pointer selanjutnya akan kita pelajari pada modul pemrograman 1 (akhir semester). TIPE DATA Penggunaan tipe data pada bahasa c++ erat kaitannya dengan penggunaan memori, perlu diperhatikan dalam penggunaanya. Terdapat tiga tipe data dalam bahasa C++ yaitu : 1. Tipe Data Dasar terdiri

Lebih terperinci

Bahasa C-M6 By Jamilah, Skom 1

Bahasa C-M6 By Jamilah, Skom 1 BAB 1 KONSEP DASAR BAHASA C 1.1 SEJARAH DAN STANDAR C Akar dari bahasa C adalah bahasa BCPL yang dikembangkan oleh Martin Richard pada tahun 1967. Bahasa ini memberkan ide kepada ken thompson yang kemudian

Lebih terperinci

PENGERTIAN. 2. Operator Unary 3. Operator Binary 4. Operator Ternary

PENGERTIAN. 2. Operator Unary 3. Operator Binary 4. Operator Ternary OPERATOR C++ PENGERTIAN Operator adalah simbol yang mengolah nilai pada operan dan menghasilkan satu nilai baru. Operator dapat dikelompokan menjadi 4 bagian yaitu: 1. Operator Assignment 2. Operator Unary

Lebih terperinci

MODUL V POINTER DAN STRING

MODUL V POINTER DAN STRING MODUL V POINTER DAN STRING I TUJUAN 1 Mahasiswa dapat menjelaskan tentang konsep dari variabel pointer 2 Mahasiswa dapat menjelaskan tentang pointer dan string 3 Mahasiswa dapat menjelaskan tentang pointer

Lebih terperinci

Chapter 2 Tipe Data, Identifier, Operator dan Control Statement

Chapter 2 Tipe Data, Identifier, Operator dan Control Statement Chapter 2 Tipe Data, Identifier, Operator dan Control Statement Tipe Data dan Identifier Program adalah kumpulan instruksi yang disusun sedemikian rupa sehingga mempunyai urutan nalar yang tepat untuk

Lebih terperinci

Struktur Bahasa C dan C++

Struktur Bahasa C dan C++ Elemen Program Struktur Bahasa C dan C++ Bahasa C merupakan bahasa pendahulu dari bahasa C++. Pencipta C adalah Brian W. Kernighan dan Dennis M. Ritchie pada sekitar tahun 1972. C adalah bahasa pemrograman

Lebih terperinci

BAB 6 POINTER DAN REFERENCE

BAB 6 POINTER DAN REFERENCE BAB 6 POINTER DAN REFERENCE. 6.1 Pendahuluan Salah satu kelebihan dari bahasa C/C++ adalah karena bahasa ini mendukung sepenuhnya untuk pemanipulasian memori dengan menggunakan pointer. Namun di balik

Lebih terperinci

Daftar lsi... :;.:;:(:;;::t

Daftar lsi... :;.:;:(:;;::t :;.:;:(:;;::t Daftar lsi Kata Pengantar... Daftar lsi............. Daftar Gambar... Daftar Tabel............... t ~... v vii xv xvii Bab 1 Review Objek dan Kelas... 1 Abstraksi dan Kelas... 2 Apa Itu Suatu

Lebih terperinci

PEMROGRAMAN BERORIENTASI OBJEK KONSEP PBO

PEMROGRAMAN BERORIENTASI OBJEK KONSEP PBO PEMROGRAMAN BERORIENTASI OBJEK KONSEP PBO Budhi Irawan, S.Si, M.T 1 PENDAHULUAN Meskipun bahasa C adalah bahasa pemrograman yang berkekuatan tinggi (powerful) atau bisa digunakan untuk membuat program

Lebih terperinci

Dasar Pemrograman Java

Dasar Pemrograman Java Dasar Pemrograman Java Tessy Badriyah, SKom. MT. http://lecturer.eepis-its.edu/~tessy Tujuan Pembelajaran Penggunaan Komentar dalam program Memahami perbedaan identifier yang valid dan yang tidak valid

Lebih terperinci

Pemrograman C++ BAGIAN II PEMROGRAMAN BERORIENTASI OBJEK

Pemrograman C++ BAGIAN II PEMROGRAMAN BERORIENTASI OBJEK BAGIAN II PEMROGRAMAN BERORIENTASI OBJEK BAB 10 KONSEP DASAR OOP 10.1 Pendahuluan Salah satu alasan Bjarne Stroustrup menciptakan bahasa C + + adalah untuk menambahkan kemampuan OOP (Object Oriented Programming)

Lebih terperinci

FAKULTAS TEKNIK UNIVERSITAS NEGERI YOGYAKARTA LABSHEET ALGORITMA DAN STRUKTUR DATA

FAKULTAS TEKNIK UNIVERSITAS NEGERI YOGYAKARTA LABSHEET ALGORITMA DAN STRUKTUR DATA Hal 1 dari 10 A. KOMPETENSI 1. Memahami pengertian dan manfaat fungsi 2. Memahami fungsi tanpa nilai balik 3. Memahami fungsi dengan nilai balik 4. Memahami jenis parameter: masukan, keluaran, dan masukan/keluaran

Lebih terperinci

elemen Dasar Bahasa Pemrograman C

elemen Dasar Bahasa Pemrograman C Elemen-elemen elemen Dasar Bahasa Pemrograman C Algoritma dan Pemrograman Tahar Agastani Teknik Informatika UIN - 2008 Identifier : Elemen Dasar C Nama pengenal (identifier) adalah nama-nama yang ditentukan

Lebih terperinci

3. Elemen Dasar C++ S. Indriani S. L., M.T L.,

3. Elemen Dasar C++ S. Indriani S. L., M.T L., 3. Elemen Dasar C++ S. Indrianii L., M.T Himpunan karakter Suatu pengenal berupa satu atau beberapa karakter Huruf A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q

Lebih terperinci

Instalasi Code::Blocks, Tipe Data, Variabel, Konstanta, Operator, Input-Output dan Flowchart

Instalasi Code::Blocks, Tipe Data, Variabel, Konstanta, Operator, Input-Output dan Flowchart Instalasi Code::Blocks, Tipe Data, Variabel, Konstanta, Operator, Input-Output dan Flowchart Pertemuan ke-1 Praktikum Algoritma dan Pemrograman Laboratorium Pemrograman dan Informatika Teori Pengumuman

Lebih terperinci

Pengantar Pemrograman Dengan C++

Pengantar Pemrograman Dengan C++ Pengantar Pemrograman Dengan C++ Pengantar Apa itu program? Bagaimanakah membuatnya? Jika sudah dibuat, apakah gunanya? Mungkin itu adalah pertanyaan pertanyaan dari orang orang yang baru saja mengenal

Lebih terperinci

PENGENALAN BAHASA C. A. Struktur Kode Program dalam Bahasa C Secara garis besar, suatu kode program dalam bahasa C memiliki struktur umum seperti ini:

PENGENALAN BAHASA C. A. Struktur Kode Program dalam Bahasa C Secara garis besar, suatu kode program dalam bahasa C memiliki struktur umum seperti ini: PENGENALAN BAHASA C A. Struktur Kode Program dalam Bahasa C Secara garis besar, suatu kode program dalam bahasa C memiliki struktur umum seperti ini: Kebanyakan pemrogram jarang memberikan keterangan/

Lebih terperinci

Chapter 1 KONSEP DASAR C

Chapter 1 KONSEP DASAR C Chapter 1 KONSEP DASAR C Sejarah Dan Standar C Akar dari bahasa C adalah BCPL (dikembangkan oleh Martin Richard tahun 1967). Kemudian Tahun 1970, Ken Thompson mengembangkan bahasa tersebut yang di kenal

Lebih terperinci

Basic Input/Output Operator Yoannita

Basic Input/Output Operator Yoannita DASAR PEMROGRAMAN Basic Input/Output Operator Yoannita Standard Output (cout) cout

Lebih terperinci

DASAR PEMROGRAMAN. PENGANTAR BAHASA C ( Sejarah, Struktur Pemrograman, Tipe Data, Operator ) Djoko Soerjanto, M.Kom

DASAR PEMROGRAMAN. PENGANTAR BAHASA C ( Sejarah, Struktur Pemrograman, Tipe Data, Operator ) Djoko Soerjanto, M.Kom DASAR PEMROGRAMAN PENGANTAR BAHASA C ( Sejarah, Struktur Pemrograman, Tipe Data, Operator ) Djoko Soerjanto, M.Kom https://www.facebook.com/groups/dasarpemrogramanc TUJUAN Mengenal sejarah, struktur, sintaks

Lebih terperinci

PERTEMUAN III OBJEK DAN CLASS TUJUAN PRAKTIKUM

PERTEMUAN III OBJEK DAN CLASS TUJUAN PRAKTIKUM PERTEMUAN III OBJEK DAN CLASS TUJUAN PRAKTIKUM 1. Praktikan memahami perbedaan objek dan class pada Java. 2. Praktikan memahami konsep berorientasi objek. 3. Praktikan dapat membuat program sederhana dengan

Lebih terperinci

PENGENALAN C++ Bab 1

PENGENALAN C++ Bab 1 PENGENALAN C++ Bab 1 1.1 SEJARAH C++ Bahasa C++ diciptakan oleh Bjarne Stroustrup di AT&T Bell Laboratories awal tahun 1980-an berdasarkan C ANSI (American National Standard Institute). Pertama kali, prototype

Lebih terperinci

PEMROGRAMAN BERORIENTASI OBJEK. Percabangan. Budhi Irawan, S.Si, M.T

PEMROGRAMAN BERORIENTASI OBJEK. Percabangan. Budhi Irawan, S.Si, M.T PEMROGRAMAN BERORIENTASI OBJEK Percabangan Budhi Irawan, S.Si, M.T PERCABANGAN Salah satu permasalahan yang akan dijumpai dalam pembuatan program adalah percabangan. Percabangan yang dimaksud adalah suatu

Lebih terperinci

2 TIPE DATA DAN VARIABEL

2 TIPE DATA DAN VARIABEL BAB 2 TIPE DATA DAN VARIABEL Kompetensi Dasar dan Indikator : Setelah mengikuti materi kuliah ini mahasiswa mampu menggunakan tipe data dan variable yang ada dalam Java, dengan indikator mahasiswa mampu:

Lebih terperinci

Kurikulum Qt. { Basic OOP } Chapter 4. Function

Kurikulum Qt. { Basic OOP } Chapter 4. Function Kurikulum Qt { Basic OOP } Chapter 4 Function. Agenda Fungsi Konsep Dasar Fungsi Mendefinisikan Fungsi Deklarasi Fungsi (Prototype) Hasil Balik Fungsi Ruang Lingkup Variabel Variable Lokal Variable Global

Lebih terperinci

VARIABEL, TIPE DATA DAN EKSPRESI Bab 2

VARIABEL, TIPE DATA DAN EKSPRESI Bab 2 VARIABEL, TIPE DATA DAN EKSPRESI Bab 2 2.1 IDENTIFIER Indentifier adalah nama yang diberikan untuk nama objek, nama fungsi, nama variable, dll ( sifatnya case sensitive ). Identifier pada C++ terdiri dari

Lebih terperinci

MATERI/BAHAN PRAKTIKUM PENDAHULUAN DAN PENGENALAN (IDENTIFIER)

MATERI/BAHAN PRAKTIKUM PENDAHULUAN DAN PENGENALAN (IDENTIFIER) MATERI/BAHAN PRAKTIKUM PENDAHULUAN DAN PENGENALAN (IDENTIFIER) I. TUJUAN 1. Mahasiswa mengenal struktur bahasa pemrograman C dan C++ 2. Mahasiswa mengenal perintah-perintah dasar C dan C++ 3. Mahasiswa

Lebih terperinci

VARIABEL & TIPE DATA PEMROGRAMAN C++

VARIABEL & TIPE DATA PEMROGRAMAN C++ VARIABEL & TIPE DATA PEMROGRAMAN C++ ruliriki@gmail.com VARIABEL Suatu nama yang menyatakan tempat dalam memori komputer Menyimpan nilai yang dapat diubah VARIABEL Pengenal (identifier) yang digunakan

Lebih terperinci

MODUL. Pemrograman Terstruktur Semester IV, 2017 Acihmah Sidauruk, M.Kom. 1. Tujuan. 2. Teori Singkat. 3. Praktikum KONSTAN DAN OPERATOR

MODUL. Pemrograman Terstruktur Semester IV, 2017 Acihmah Sidauruk, M.Kom. 1. Tujuan. 2. Teori Singkat. 3. Praktikum KONSTAN DAN OPERATOR KONSTAN DAN OPERATOR Pemrograman Terstruktur Semester IV, 2017 Acihmah Sidauruk, M.Kom 1. Tujuan Mahasiswa dapat membuat deklarasi konstanta, serta dapat menuliskan ekspresi aritmatik dengan benar,dapat

Lebih terperinci

DISUSUN OLEH BAB III OPERAS. macam, yaitu: baru. karakter. Tipe. Tipe Data. Tetapi. dataa tersebut. HAL 1

DISUSUN OLEH BAB III OPERAS. macam, yaitu: baru. karakter. Tipe. Tipe Data. Tetapi. dataa tersebut. HAL 1 DISUSUN OLEH : ADAM MUKHARIL BACHTIAR, S..Kom. DIKTAT MATAA KULIAH PEMROGRAMAN I BAB III TIPE DATA, VARIABEL, DAN OPERAS SI PERHITUNGAN IF Tipe Data Pembuatan sebuah program dimaksudkan untuk mengolah

Lebih terperinci

BAB II VARIABEL DAN TIPE DATA

BAB II VARIABEL DAN TIPE DATA BAB II VARIABEL DAN TIPE DATA Bahasa pemrograman pada umumnya, mengenal adanya variabel yang digunakan untuk menyimpan nilai atau data. Sedangkan Java sendiri dikenal sebagai bahasa pemrograman dengan

Lebih terperinci

LANGKAH-LANGKAH MENULISKAN PROGRAM DALAM TURBO C++

LANGKAH-LANGKAH MENULISKAN PROGRAM DALAM TURBO C++ I.PENDAHULUAN 1. 1. ALGORITMA Algoritma adalah urutan aksi-aksi yang dinyatakan dengan jelas dan tidak rancu untuk memecahkan suatu masalah dalam rentang waktu tertentu. Setiap aksi harus dapat dikerjakan

Lebih terperinci

Alpro & Strukdat 1 C++ (Sub Program) Dwiny Meidelfi, S.Kom., M.Cs.

Alpro & Strukdat 1 C++ (Sub Program) Dwiny Meidelfi, S.Kom., M.Cs. Alpro & Strukdat 1 C++ (Sub Program) Dwiny Meidelfi, S.Kom., M.Cs. Sub Program Dibagi/dipecah menjadi modul-modul program yang digunakan untuk menyelesaikan masalah tertentu Mudah dibaca, terlihat garis

Lebih terperinci

MODUL 10 Fungsi 10.1 Kompetensi 10.2 Alat Dan Bahan: 10.3 Ulasan Teori: Dasar Fungsi Deklarasi Fungsi

MODUL 10 Fungsi 10.1 Kompetensi 10.2 Alat Dan Bahan: 10.3 Ulasan Teori: Dasar Fungsi Deklarasi Fungsi MODUL 10 Fungsi 10.1 Kompetensi 1. Mahasiswa mampu membagi logika program dengan menggunakan fungsi. 2. Mahasiswa memahami konsep rekursif serta mengimplementasikan dengan menggunakan fungsi. 10.2 Alat

Lebih terperinci

MODUL 6 PERULANGAN. A. String. 1. Instansiasi dan Inisialisasi. M0601xxyyy.jar

MODUL 6 PERULANGAN. A. String. 1. Instansiasi dan Inisialisasi. M0601xxyyy.jar MODUL 6 PERULANGAN Topik-topik yang dibahas pada modul ini adalah mengenai kelas String, kelas Random, dan konsep perulangan. Pertanyaan-pertanyaan yang dijawab dalam bentuk teks harus Anda kumpulkan dengan

Lebih terperinci

Konstants Dan Operator

Konstants Dan Operator PRAKTIKUM 3 Konstants Dan Operator Tujuan: 1. Dapat mendeklarasikan konstanta. 2. Dapat menuliskan ekspresi aritmatik dengan benar, berikut pemilihan tipe data yang benar. 3. Dapat menggunakan operator

Lebih terperinci

A. TUJUAN 1. Menjelaskan tentang prinsip dasar fungsi. 2. Menjelaskan tentang.parameter formal dan parameter aktual

A. TUJUAN 1. Menjelaskan tentang prinsip dasar fungsi. 2. Menjelaskan tentang.parameter formal dan parameter aktual Praktikum 7 FUNGSI 1 A. TUJUAN 1. Menjelaskan tentang prinsip dasar fungsi. 2. Menjelaskan tentang.parameter formal dan parameter aktual B. DASAR TEORI Fungsi adalah suatu bagian dari program yang dirancang

Lebih terperinci

1.4 Struktur Program Pada C++ Program C maupun C++ secara umum tersusun dari beberapa bagian utama, yaitu :

1.4 Struktur Program Pada C++ Program C maupun C++ secara umum tersusun dari beberapa bagian utama, yaitu : 1.2 Dasar Teori 1.2.1 Sejarah Bahasa C/C++ Bahasa C++ diciptakan oleh Bjarne Stroustrup di AT&T Bell Laboratories awal tahun 1980-an berdasarkan C ANSI (American National Standard Institute). Pertama kali

Lebih terperinci

Identifier dan Tipe Data

Identifier dan Tipe Data Identifier dan Tipe Data Identifier Identifier atau pengenal merupakan nama yang biasa digunakan untuk : - Variable - Konstanta bernama - Fungsi - Dll Aturan yang berlaku bagi suatu pengenal secara umum

Lebih terperinci

Konsep Array dalam PBO

Konsep Array dalam PBO PEMROGRAMAN BERORIENTASI OBJEK Konsep Array dalam PBO Budhi Irawan, S.Si, M.T PENDAHULUAN Array (Larik) merupakan hal fundamental yang sering dijumpai dalam banyak kasus didunia pemrograman, maka dari

Lebih terperinci

AP 2B: PENGENALAN PADA C++ Isram Rasal S.T., M.M.S.I, M.Sc. Program Studi Teknik Informatika Fakultas Teknologi Industri Universitas Gunadarma

AP 2B: PENGENALAN PADA C++ Isram Rasal S.T., M.M.S.I, M.Sc. Program Studi Teknik Informatika Fakultas Teknologi Industri Universitas Gunadarma AP 2B: PENGENALAN PADA C++ Isram Rasal S.T., M.M.S.I, M.Sc. Program Studi Teknik Informatika Fakultas Teknologi Industri Universitas Gunadarma 1 Tujuan Perkuliahan Mahasiswa dapat memahami: Mahasiswa mengetahui

Lebih terperinci

DISUSUN OLEH BAB XI POINTER. alamat. memori. sepenuhnya. pointer. dan Pointer. menggunakan. menyebabkan. Alamat. untuk.

DISUSUN OLEH BAB XI POINTER. alamat. memori. sepenuhnya. pointer. dan Pointer. menggunakan. menyebabkan. Alamat. untuk. DISUSUN OLEH : ADAM MUKHARIL BACHTIAR, S..Kom. DIKTAT MATAA KULIAH PEMROGRAMAN I BAB XI POINTER IF Pendahuluan Pointer Secara konsep pointer adalah sebuah variabel yang menyimpan suatu alamat memori yang

Lebih terperinci

Badiyanto, S.Kom., M.Kom. PBO java

Badiyanto, S.Kom., M.Kom. PBO java Badiyanto, S.Kom., M.Kom PBO java Apa yang Disebut Java? Bahasa pemrograman berorientasi objek murni yang dibuat berdasarkan kemampuankemampuan terbaik bahasa pemrograman objek sebelumnya (C++, Ada, Simula).

Lebih terperinci

8.1 FUNGSI, DEKLARASI DAN DEFINISI NYA

8.1 FUNGSI, DEKLARASI DAN DEFINISI NYA 8 FUNGSI Fungsi adalah sekumpulan perintah operasi program yang dapat menerima argumen input dan dapat memberikan hasil output yang dapat berupa nilai ataupun sebuah hasil operasi. Nama fungi yang didefinisikan

Lebih terperinci

BAB IV HASIL PENELITIAN DAN PENERAPAN

BAB IV HASIL PENELITIAN DAN PENERAPAN 87 BAB IV HASIL PENELITIAN DAN PENERAPAN 4.1 Karakteristik bahasa pemrograman DOGI Berikut ini akan dijabarkan karakteristik-karakteristik bahasa pemrograman DOGI yang mempengaruhi readability, writability

Lebih terperinci

Fungsi. Fungsi. Dasar Komputer & Pemrograman 1. dipecah Sub Program. Program. Dasar Komputer & Pemrograman TC22052 Kartika Firdausy - UAD

Fungsi. Fungsi. Dasar Komputer & Pemrograman 1. dipecah Sub Program. Program. Dasar Komputer & Pemrograman TC22052 Kartika Firdausy - UAD Fungsi Dasar Komputer & Pemrograman TC22052 Kartika Firdausy - UAD Program dipecah Sub Program modul / routine / prosedur / fungsi Dasar Komputer & Pemrograman 1 Keuntungan modularisasi program 1. Menghindari

Lebih terperinci

BAB 3 TYPE DATA, VARIABLE DAN OPERATOR

BAB 3 TYPE DATA, VARIABLE DAN OPERATOR BAB 3 TYPE DATA, VARIABLE DAN OPERATOR Bahasa pemrograman pada umumnya, mengenal adanya variabel yang digunakan untuk menyimpan nilai atau data. Sedangkan Java sendiri dikenal sebagai bahasa pemrograman

Lebih terperinci

C V.S. C++ Oleh : Rasim

C V.S. C++ Oleh : Rasim C V.S. C++ Oleh : Rasim Komentar simbol //, untuk komentar satu baris contoh: scanf( %d,&a); //memasukan data ke variable a /* dan */, untuk blok komentar contoh: /* file : latih1.cpp Programmer : XXX

Lebih terperinci

BAB VIII SUB PROGRAM : Fungsi Tanpa Pengembalian Nilai

BAB VIII SUB PROGRAM : Fungsi Tanpa Pengembalian Nilai BAB VIII SUB PROGRAM : Fungsi Tanpa Pengembalian Nilai Pendahuluan Dalam bahasa pemrograman prosedural, program bisa terdiri dari beberapa sub program. Dengan membuat sub program, penulisan kode program

Lebih terperinci

Kurikulum Qt. Chapter 8 - Polymorphism. Polimorfisme. Problema Pewarisan Tunggal (Single Inheritance)

Kurikulum Qt. Chapter 8 - Polymorphism. Polimorfisme. Problema Pewarisan Tunggal (Single Inheritance) Chapter 8 - Polymorphism Polimorfisme Secara teknis polimorfisme merupakan suatu konsep untuk merelasikan diatara kelas-kelas C++ melalui overriding metode-metode virtual, sehingga dengan demikian satu

Lebih terperinci

Elemen Dasar Dalam Bahasa Java

Elemen Dasar Dalam Bahasa Java Elemen Dasar Dalam Bahasa Java 1. Kata Kunci Kata kunci adalah kata-kata yang didefenisikan oleh compiler dan memiliki arti dan tujuan spesifik. Java tidak mengizinkan kata-kata tersebut dipakai sebagai

Lebih terperinci

Tipe Data, Variabel, Input/Output

Tipe Data, Variabel, Input/Output Tipe Data, Variabel, Input/Output Pendahuluan Untuk membuat program dengan bahasa pemrograman C harus memperhatikan struktur dasarnya. Strukturnya diawali dengan bagian preprocessor directive yang biasanya

Lebih terperinci

Part 2 - Algoritma & Pemrograman Konsep dasar Pemrograman

Part 2 - Algoritma & Pemrograman Konsep dasar Pemrograman Part 2 - Algoritma & Pemrograman Konsep dasar Pemrograman Apa itu Program? Program adalah deretan instruksi yang digunakan untuk mengendalikan komputer, sehingga komputer dapat melakukan tindakan sesuai

Lebih terperinci

Teknik Pemrograman Terstruktur 1 PENGENALAN BAHASA C

Teknik Pemrograman Terstruktur 1 PENGENALAN BAHASA C 1 PENGENALAN BAHASA C Paradigma Pemrograman Pemrograman Deklaratif/Fungsional Persoalan diselesaikan dengan mengekspresikan logika persoalan Pemrograman Prosedural/Terstruktur Persoalan diselesaikan dengan

Lebih terperinci

PEMROGRAMAN BERORIENTASI OBJEK. Input / Output. Budhi Irawan, S.Si, M.T

PEMROGRAMAN BERORIENTASI OBJEK. Input / Output. Budhi Irawan, S.Si, M.T PEMROGRAMAN BERORIENTASI OBJEK Input / Output Budhi Irawan, S.Si, M.T PENDAHULUAN Sejauh ini sudah sering digunakan cout untuk menuliskan ke layar dan cin untuk membaca nilai dari keyboard tanpa membahas

Lebih terperinci

Tipe Data dan Operator

Tipe Data dan Operator Tipe Data dan Operator Dasar Algoritma dan Pemrogrman Eka Maulana, ST, MT, MEng. Klasifikasi Tipe Data 1 Tipe Data Tipe data adalah jenis data yang dapat diolah oleh komputer untuk memenuhi kebutuhan dalam

Lebih terperinci

Notasi Algoritma Separator Special Character Kesalahan pada program Yoannita

Notasi Algoritma Separator Special Character Kesalahan pada program Yoannita DASAR PEMROGRAMAN Notasi Algoritma Separator Special Character Kesalahan pada program Yoannita Algoritma Program mengandung suatu algoritma (method yang digunakan untuk menyelesaikan suatu permasalahan)

Lebih terperinci

Satuan Acara Perkuliahan (SAP) UNIVERSITAS GUNADARMA

Satuan Acara Perkuliahan (SAP) UNIVERSITAS GUNADARMA Mata Kuliah : Teknik Pemrograman Terstruktur 2 Fakultas/Jurusan : Ilmu Komputer/Manajemen Informatika Satuan Acara Perkuliahan (SAP) UNIVERSITAS GUNADARMA Minggu Pokok Bahasan/Materi 1 Pokok Bahasan :

Lebih terperinci

PRAKTIKUM 2. perubah (variabel), konstanta, fungsi, atau obyek lain yang didefinisikan oleh

PRAKTIKUM 2. perubah (variabel), konstanta, fungsi, atau obyek lain yang didefinisikan oleh PRAKTIKUM 2 1. Variabel Pengenal (identifier) merupakan nama yang biasa digunakan untuk suatu perubah (variabel), konstanta, fungsi, atau obyek lain yang didefinisikan oleh pemrogram. Variabel adalah suatu

Lebih terperinci

Cara pertama adalah pada saat deklarasi variabel ditambahkan ke- yword const sebelum nama tipe data seperti

Cara pertama adalah pada saat deklarasi variabel ditambahkan ke- yword const sebelum nama tipe data seperti KONSTANTA Menghitung besaran-besaran fisis dalam bidang fisika memerlukan suatu konstantakonstanta. Bahasa C dan C++ menyediakan tipe data tambahan sehingga variabel yang kita gunakan merupakan konstanta

Lebih terperinci

Tipe Data Dasar. Data bisa dinyatakan dalam bentuk konstanta atau variabel.

Tipe Data Dasar. Data bisa dinyatakan dalam bentuk konstanta atau variabel. Dasar Pemrograman C Objectives Menjelaskan tentang beberapa tipe data dasar Menjelaskan tentang Variabel Menjelaskan tentang konstanta Menjelaskan tentang berbagai jenis operator dan pemakaiannya Menjelaskan

Lebih terperinci

P3 Dasar Struktur Data TIF42/SIF42

P3 Dasar Struktur Data TIF42/SIF42 P3 Dasar Struktur Data TIF42/SIF42 A. Sidiq P. Prodi teknik Informatika & Prodi Sistem Informasi Fakultas Teknologi Informasi Universitas Mercu Buana Yogyakarta Pembahasan Struktur Data Primitif Struct

Lebih terperinci

PERTEMUAN V PEMROGRAMAN TERSTRUKTUR DENGAN VISUAL C Setiap bahasa C mempunyai satu fungsi dengan nama main (program utama).

PERTEMUAN V PEMROGRAMAN TERSTRUKTUR DENGAN VISUAL C Setiap bahasa C mempunyai satu fungsi dengan nama main (program utama). PERTEMUAN V PEMROGRAMAN TERSTRUKTUR DENGAN VISUAL C++ 6.0 STRUKTUR BAHASA C Setiap bahasa C mempunyai satu fungsi dengan nama main (program utama). Setiap program akan dieksekusi dimulai dari statement

Lebih terperinci

Fungsi : Dasar Fungsi

Fungsi : Dasar Fungsi PRAKTIKUM 13 Fungsi : Dasar Fungsi A. TUJUAN PEMBELAJARAN 1. Memecah program dalam fungsi fungsi yang sederhana. 2. Menjelaskan tentang pemrograman terstruktur. B. DASAR TEORI Fungsi adalah suatu bagian

Lebih terperinci

ALGORITMA DAN STRUKTUR DATA POINTER DAN FUNCTION

ALGORITMA DAN STRUKTUR DATA POINTER DAN FUNCTION ALGORITMA DAN STRUKTUR DATA POINTER DAN FUNCTION POINTER POINTER ADALAH SUATU VARIABEL PENUNJUK, BERISI NILAI YANG MENUNJUK ALAMAT SUATU LOKASI MEMORI TERTENTU. JADI POINTER TIDAK BERISI NILAI DATA, MELAINKAN

Lebih terperinci

Inheritance dan Polimorfisme

Inheritance dan Polimorfisme PEMROGRAMAN BERORIENTASI OBJEK Inheritance dan Polimorfisme Budhi Irawan, S.Si, M.T PENDAHULUAN Salah satu ciri dari PBO adalah kemampuan suatu objek atau kelas untuk mewariskan sifat-sifat yang terdapat

Lebih terperinci

VI. FUNGSI. Fungsi Main ( ) Fungsi a ( ) Fungsi b ( ) Fungsi c ( ) Fungsi c1 ( ) Fungsi c2 ( ) Fungsi c3 ( ) Bentuk umumnya :

VI. FUNGSI. Fungsi Main ( ) Fungsi a ( ) Fungsi b ( ) Fungsi c ( ) Fungsi c1 ( ) Fungsi c2 ( ) Fungsi c3 ( ) Bentuk umumnya : VI. FUNGSI 6.1. FUNGSI Fungsi adalah sekumpulan perintah operasi program yang dapat menerima argumen input dan dapat memberikan hasil output yang dapat berupa nilai ataupun sebuah hasil operasi. Hasil

Lebih terperinci

PRAKTIKUM 4 PERCABANGAN

PRAKTIKUM 4 PERCABANGAN PRAKTIKUM 4 PERCABANGAN Tujuan: Dapat menggunakan instruksi percabangan di dalam pemecahan masalah I. PERCABANGAN Salah satu permasalahan yang pasti akan dijumpai dalam pembuatan program adalah percabangan.

Lebih terperinci

BAB X. Struct Dalam C++, kita dapat membuat sebuah tipe data baru. Maka penulisan variabel baru kita akan menjadi:

BAB X. Struct Dalam C++, kita dapat membuat sebuah tipe data baru. Maka penulisan variabel baru kita akan menjadi: Lisensi Dokumen: Seluruh dokumen di IlmuKomputer.Com dapat digunakan, dimodifikasi dan disebarkan secara bebas untuk tujuan bukan komersial (nonprofit), dengan syarat tidak menghapus atau merubah atribut

Lebih terperinci

PENGANTAR BAHASA C++

PENGANTAR BAHASA C++ PENGANTAR BAHASA C++ SEJARAH SINGKAT BAHASA C Program C merupakan bahasa komputer yang sangat singkat & tidak memiliki kepanjangan. Bahasa ini diciptakan oleh Dennis Ritchie sekitar tahun 1972. Hingga

Lebih terperinci

SUB PROGRAM P E N G A N TA R P R O G R A M S T U D I. Institut Teknologi Sumatera

SUB PROGRAM P E N G A N TA R P R O G R A M S T U D I. Institut Teknologi Sumatera SUB PROGRAM P E N G A N TA R P R O G R A M S T U D I Institut Teknologi Sumatera PRE TEST Jelaskan apa yang dimaksud dengan perulangan? Sebutkan jenis metode perulangan? Apa perbedaan dari masing-masing

Lebih terperinci

Fungsi 2. Ekohariadi FT Unesa

Fungsi 2. Ekohariadi FT Unesa Fungsi 2 Ekohariadi FT Unesa Skop Variabel dan Fungsi Tubuh setiap fungsi adalah sebuah blok. Variabel yang kamu deklrasikan di dalam fungsi adalah lokal untuk fungsi tersebut dan tidak berlaku di luar

Lebih terperinci

PSEUDOCODE TIPE DATA, VARIABEL, DAN OPERATOR

PSEUDOCODE TIPE DATA, VARIABEL, DAN OPERATOR 1 PSEUDOCODE TIPE DATA, VARIABEL, DAN OPERATOR Siti Mukaromah, S.Kom TEKNIK PENYAJIAN ALGORITMA Teknik Tulisan Structure English Pseudocode Teknik Gambar Structure Chart HIPO Flowchart 2 PSEUDOCODE Kode

Lebih terperinci

SEKOLAH TINGGI MANAJEMEN INFORMATIKA & KOMPUTER JAKARTA STI&K SATUAN ACARA PERKULIAHAN

SEKOLAH TINGGI MANAJEMEN INFORMATIKA & KOMPUTER JAKARTA STI&K SATUAN ACARA PERKULIAHAN SEKOLAH TINGGI MANAJEMEN INFORMAA & KOMPUTER JAKARTA STI&K SATUAN ACARA PERKULIAHAN Mata Kuliah : PEMROGRAMAN BAHASA C++ Kode Mata Kuliah : MI - 24203 Jurusan / Jenjang : S1 SISTEM KOMPUTER Tujuan Instruksional

Lebih terperinci

MODUL 1 Alur Seleksi dengan C++

MODUL 1 Alur Seleksi dengan C++ 1 MODUL 1 Alur Seleksi dengan C++ Teori Singkat C++ merupakan perluasan bahasa C dengan tambahan fasilitas kelas (Class). Dengan fasilitas ini, maka C++ mendukung teknik pemrograman berorientasi objek

Lebih terperinci

Kurikulum Qt. Chapter 5 Pointer dan References. Agenda. Apa itu Pointer? Memory Komputer. Mengambil Alamat Memory dari Variabel

Kurikulum Qt. Chapter 5 Pointer dan References. Agenda. Apa itu Pointer? Memory Komputer. Mengambil Alamat Memory dari Variabel Chapter 5 Pointer dan References Agenda Pada chapter ini kita akan membahas beberapa topik yang berhubungan dengan pointer dan reference yaitu: Penggunaan Pointer. Pointer dan Array. Mengalokasikan memory

Lebih terperinci

PEMROGRAMAN JAVA : VARIABEL DAN TIPE DATA

PEMROGRAMAN JAVA : VARIABEL DAN TIPE DATA PEMROGRAMAN JAVA : VARIABEL DAN TIPE DATA Asep Herman Suyanto info@bambutechno.com http://www.bambutechno.com Bahasa pemrograman pada umumnya, mengenal adanya variabel yang digunakan untuk menyimpan nilai

Lebih terperinci

Algoritma & Pemrograman #3

Algoritma & Pemrograman #3 Algoritma & Pemrograman #3 by antonius rachmat c, s.kom, m.cs Tentukan nama variabel yang benar : 1. 9kepala 2. _nilaimax 3. data nilai 4. _4445 5. a_b Review: Deklarasi Identifier Variabel Bentuk umum:

Lebih terperinci