About me

My photo
Surabaya
too much to explain in words.. you may think that you know me, but sorry to say, you are WRONG..! i bet you dont know me AT ALL.. my life is amazing..and i love it damn much..

Saturday, September 26, 2009

Polimorfisme di C++

Polimorfisme sederhana dalam c++


Polymorphism adalah pemikiran bahwa objek dinamis suatu class dasar dapat berperilaku seperti class turunan. Jika objek menunjuk class dasar maka ia perilaku seperti class dasar, dan jika ia menunjuk class turunan ia akan berperilaku seperti class turunan.
Dalam hal ini obkjek memiliki beberapa bentuk, tergantung ia menunjuk kemana. Dalam hal ini suatu objek atau class dan perubahan perilakunya adalah dari kelas dasar ke kelas turunan, tidak bisa objek kelas turunan menunjuk ke kelas dasar. Polimorfisme dimungkinkan karena adanya mekanisme ikatan dinamis, ikatan ini adalah ikatan yang terjadi ketika program dijalankan (run-time), ikatan yang terjadi pada saat compiling disebut ikatan dinamis. Ikatan dinamis hanya akan terjadi antara suatu objek dinamis dengan metode yang dinamis juga, dalam hal ini metode virtual (maya)


#include
#include

class Tbujursangkar
{
protected:
double panjang;

Membuat class dengan nama class Tbujursangkar dengan variable panjang dengan tipe data double dengan sifat protected, class ini akan menjadi class dasar.


public:
Tbujursangkar(double pj){panjang=pj;}

Konstruktor dengan sifat public Tbujursangkar(double pj){panjang=pj;} yang mendefinisikan variable pj sama dengan panjang,


double Panjang(){return panjang;}

fungsi Panjang dengan return value double yang mengembalikan nilai kembali ke variable panjang

virtual double Lebar(){return panjang;}

Lalu fungsi Lebar dengan penambahan syntax virtual di depan nama fungsi menandakan fungsi tersebut bersifat polimorfisme, syntax virtual akan menciptakan ikatan dinamis, ikatan ini adalah ikatan yang terjadi ketika program dijalankan (ru-time), Ikatan dinamis ini hanya akan terjadi antara suatu objek dinamis dengan metode yang dinamis juga, dalam hal ini metode virtual (maya)


double Luas(){return Panjang() *Lebar() ;}};

fungsi double Luas dengan parameter mengalikan antara fungsi Panjang dengan fungsi Lebar, yang akan menghasilkan Luas persegi panjang.


class Tpersegipanjang:public Tbujursangkar
{
Deklarasi Class diatas merupakan class Tpersegipanjang yang merupakan turunan dari class Tbujursangkar,

protected:
double lebar;

deklarasi variable lebar, variable lebar merupakan variable tambahan yang diperlukan untuk menghitung suatu persegi panjang, karena variable panjang telah ada dalam class induknya sehingga tidak perlu ditampilkan lagi.

public:
Tpersegipanjang(double pj, double lb):Tbujursangkar(pj){lebar=lb;}

Pada bagian public terdapat konstruktor Tpersegipanjang, yang mendeklarasikan variable pj dan lb dimana pj sama dengan panjang dan lb sama dengan lebar.


virtual double Lebar(){return lebar;}

deklarasi virtual fungsi Lebar yang menandakan bersifat polimorfisme ini diketahui dengan penambahan kode virtual didepan nama fungsi.

void main()//program utama
{
Tpersegipanjang *pp=new Tpersegipanjang(8,6);

Memanggil konstruktor Tpersegipanjang dalam variable pointer pp, variable pp ini di inisialiasi dengan nilai dari dari Tpersegipanjang yaitu 8 dan 6.


cout<<"panjang = "<<<"lebar = "<<<"luas = "<

Menampilkan nilai dari panjang() dengan fungsi yang dipanggil pada kelas Tbujursangkar, lebar() dipanggil dengan fungsi dari kelas Tpersegipanajng yang bersifat polymorfisme sehingga akan terbentuk ikatan dinamis antara variable panjang dengan fungsi lebar() dan luas() dengan fungsi yang dipanggil dari kelas Tbujursangkar.


delete pp;
getch();
}

menghapus nilai dari variable pp agar tidak membebani memori. Dari dua kelas diatas, pada kelas TBujursangkar pada saat pendefinisian fungsi lebar, return ditujukan ke variabel panjang, sedangkan pada kelas Tpersegipanjang juga didefinisikan fungsi lebar yang return valuenya dikembalikan ke variabel lebar. Sehingga dari kejadian inilah terjadi apa yang dinamakan polimorfisme, yaitu pendefinisian dua fungsi dengan nama yang sama pada kelas yang berbeda dan dengan parameter yang berbeda. Polimorfisme tidak sama dengan overloading. Untuk menghindari polimorfisme yaitu dengan cara menambahkan keyword virtual didepan fungsi tersebut seperti yang terlihat pada contoh program diatas. Sehingga ketika program tersebut jika dijalankan hasil dari fungsi luas() adalah 48.
untuk penambahan fungsi keliling pada program, penambahanya adalah sebagai berikut :
virtual double keliling(){return 2*(panjang+lebar);}
atau dapat juga menambahkanya pada class Tbujursangkar, hasilnya akan sama saja. Isi dari fungsi diatas adalah rumus dari keliling persegipanjang. Dan untuk menampilkan output adalah sebagai berikut


<<"Keliling= "<

Merupakan pemanggilan dari fungsi keliling pada program utama sama dengan pemanggilan pada fungsi lebar sebelumnya.

kode langkap :

  • #include"iostream.h"
  • #include"stdlib.h"
  • /* class DENGAN virtual( POLYMORPHISME)==========*/
  • class tbujursangkar_vir
  • {
  • protected :
  • double panjang; //panjang sisi bujur sangkar
  • public:
  • tbujursangkar_vir(double pj) {panjang = pj;}
  • double panjangf() {return panjang;}
  • virtual double lebarf() {return panjang;}
  • double luasf() {return panjangf()*lebarf();}
  • double keliling() {return 4*panjang;}
  • };
  • class tpersegipanjang_vir:public tbujursangkar_vir
  • {
  • protected:
  • double lebar; //lebar persegi panjang
  • public:
  • tpersegipanjang_vir(double pj, double lb):
  • tbujursangkar_vir(pj) {lebar = lb;}
  • virtual double lebarf() {return lebar;}
  • double keliling() {return 2*panjang+2*lebar;}
  • };
  • //=========================================main===============================//
  • void main()
  • {
  • double a,b;
  • cout<>a ;
  • cout<>b ;
  • tbujursangkar_vir *bujur = new tbujursangkar_vir(a);
  • tpersegipanjang_vir *persegi = new tpersegipanjang_vir(a,b);
  • cout<<"===========hasil pada class tbujursangkar================"<
  • cout<<"panjang = "<
  • cout<<"lebar = "<
  • cout<<"luas = "<
  • cout<<"keliling = "<<
  • cout<<"===========hasil pada class tpersegipanjang================"<
  • cout<<"panjang = "<
  • cout<<"lebar = "<
  • cout<<"luas = "<
  • cout<<"keliling = "<
  • delete bujur;
  • delete persegi;
  • system("pause");
  • }

  • Contoh Program :

  • #include "iostream.h"
  • class TX
  • {
  • public:
  • double FA(double p) { return p*p; }
  • double FB(double p) { return FA(p) / 2; }
  • };
  • class TY : public TX
  • {
  • public:
  • double FA(double p) { return p*p*p; }
  • };
  • void main()
  • {
  • TY y;
  • cout <<>
  • }
output :


Sumber : http://sipemalas.wordpress.com/2009/05/16/polimorfisme-sederhana-dalam-c/

Konstruktor C++

Konstruktor

Sebelumnya kita telah menggunakan member fungsi assign() untuk memasukkan nilai ke dalam member variabel pembilang dan penyebut. Sebuah konstruktor melakukan tugas yang sama dengan fungsi assign(), sehingga Anda tidak perlu repot-repot memanggil fungsi assign() untuk setiap objek yang Anda deklarasikan. Sebuah konstruktor harus mempunyai nama yang sama dengan kelas dimana konstruktor tersebut berada, dan dideklarasikan tanpa return value (nilai balik), juga tanpa kata kunci void. Mari kita kembangkan kelas BilanganRasional yang telah kita bahas sebagai berikut :

class BilanganRasional

{

public :

//KONSTRUKTOR BilanganRasional

BilanganRasional(int pemb, int peny)

{

pembilang = pemb;

penyebut = peny;

}

private :

int pembilang, penyebut;

};

pembilang

penyebut

objekBilangan

Bandingkan struktur konstruktor dengan fungsi assign() yang telah kita bahas sebelumnya. Konstruktor BilanganRasional melakukan tugas yang sama dengan member fungsi assign(). Bedanya hanya terletak pada pemanggilan fungsi dan konstruktor tersebut. Jika fungsi assign() harus kita panggil dengan didahului oleh pendeklarasian sebuah objek, kemudian fungsi dari objek tersebut dipanggil dengan operator titik disertai nilai yang ingin kita input, misal

BilanganRasional x;

x.assign(22,7);

maka konstruktor cukup dipanggil sebagai berikut :

BilanganRasional x(22,7);

Kedua varian tersebut melakukan hal yang sama, yakni menginitialisasikan nilai 22 ke member variabel pembilang, dan nilai 7 ke variabel penyebut.

Konstruktor Dengan Initialization Lists

Penulisan konstruktor dengan daftar initialisasi (initialization lists) merupakan fasilitas yang disediakan oleh C++ untuk menyederhanakan struktur konstruktor. Ini berarti, contoh konstruktor di atas dapat pula ditulis sebagai berikut :

class BilanganRasional

{

public :

BilanganRasional(int pemb, int peny) : pembilang(pemb), penyebut(peny) { }

private :

int pembilang, penyebut;

};

Contoh di atas menghasilkan fungsi yang sama dengan konstruktor yang kita bahas sebelumnya.

CopyConstructor

Sampai sejauh ini kita telah mempelajari bagaimana struktur sebuah konstruktor serta bagaimana membuat objek dari konstruktor yang telah didefinisikan. Akan tetapi, coba bayangkan apabila Anda telah mempunyai sebuah objek x, dan kemudian Anda menginginkan membuat sebuah objek y yang memiliki nilai member data dan member fungsi yang sama. Tentu saja Anda dapat mendeklarasikan objek baru dengan memanggil konstruktor yang sama sebanyak 2 kali :

BilanganRasional x(22,7);

BilanganRasional y(22,7);

Perintah di atas mendeklarasikan 2 objek, yakni x dan y yang masing-masing memiliki nilai 22 pada member variabel pembilang dan 7 pada member variabel penyebut. Akan tetapi, Anda dapat juga mempersingkat kode diatas dengan perintah berikut :

BilanganRasional x(22,7);

BilanganRasional y(x);

Berikut listing contoh untuk Copy Constructor :

class BilanganRasional

{

public :

BilanganRasional(int pemb, int peny) : pembilang(pemb), penyebut(peny) { }

//CopyConstructor terdapat disini

BilanganRasional(const BilanganRasional& br) : pembilang(br.pembilang), penyebut(br.penyebut) { }

private :

int pembilang, penyebut;

};

void main()

{

BilanganRasional x(22,7);

BilanganRasional y(x);

}

Deklarasi CopyConstructor otomatis dipanggil ketika Anda mengkopi objek x ke objek y. Perhatikan bahwa x menjadi parameter ketika kita mendeklarasikan objek y.

Ringkasan

Pada bab ini Anda telah mengetahui konsep OOP, mengapa OOP disebut paradigma serta apa bedanya konsep pemrograman berorientasi objek dengan konsep pemrograman terstruktur. Anda juga telah belajar mendefinisikan sebuah kelas, mendefinisikan member fungsi dan member data serta struktur konstruktor dan destruktor dari sebuah kelas. C++ juga menyediakan fasilitas jika Anda ingin membuat duplikat sebuah objek, yaitu menggunakan fasilitas CopyConstructor. Selain itu Anda juga telah belajar mendeklarasikan sebuah konstruktor dengan Initialization Lists, sehingga pendeklarasian konstruktor Anda menjadi lebih efisien.

contoh program :

  • #include "iostream.h"


  • class CRectangle {

  • int *width, *height;

  • public:

  • CRectangle (int,int);

  • ~CRectangle ();

  • int area (void) {return (*width * *height);}

  • };


  • CRectangle::CRectangle (int a, int b) { // constructor

  • width = new int;

  • height = new int;

  • *width = a;

  • *height = b;

  • }


  • CRectangle::~CRectangle () { // destructor

  • delete width;

  • delete height;

  • }


  • int main () {

  • CRectangle rect (3,4), rectb (5,6);

  • cout << "Konsep luas persegi dengan Konstruktor dan Destruktor" << "\n";

  • cout << "Penghitungan Luas Persegi dengan value yang terset !" << "\n";

  • cout << "luas persegi a : " <<>

  • cout << "luas persegi b : " <<>

  • return 0;

  • }



  • output :


Daftar Pustaka :

1. Erlenkötter, Helmut. C++, Objektorientiertes Programmieren von Anfang an

2. http://infocom.cqu.edu.au/Staff/Mike_Turnbull/Home_Page/Lecturetts/Sect101.htm

3. http://www.aw-bc.com/catalog/academic/product/0,4096,0201895501-PRE,00.html

4. http://www.desy.de/gna/html/cc/Tutorial/node3.htm

5. http://www.uni-koeln.de/rrzk/kurse/unterlagen/CPPKURS/

6. http://www.uni-koeln.de/rrzk/kurse/unterlagen/CPPKURS/HTML/begriffe.htm

7. Hubbard, John R. Ph.D. Schaum’s Outlines. Programming with C++.