03 Fitur Object-Oriented C++ full

90
Fitur Object-Oriented C++ Lecture 03 – Struktur Data

Transcript of 03 Fitur Object-Oriented C++ full

  • Fitur Object-Oriented C++

    Lecture 03 Struktur Data

  • UKDW Struktur Data

    Required Reading

    Baca:

    Textbook A Appendix A.8, Chapter C++ Interlude 1

    Textbook B Chapter 3.1, 3.2, 9.1

    Textbook C Chapter 4, 8

  • UKDW Struktur Data

    Bahasa Object-Oriented

    Bahasa pemrograman dpt diklasifikasikan menjadi beberapa model pemrograman

    Model pemrograman menentukan bagaimana mengorganisasi informasi (data) dan proses (fungsi)

    Model pemrograman yg populer:

    Bahasa prosedural: Pascal, C

    Bahasa object-oriented: C++, Java

  • UKDW Struktur Data

    Bahasa Prosedural

    Karakteristik bahasa prosedural:

    Data dan fungsi dipisahkan

    User yang memastikan data dan fungsi digunakan dengan benar

    Tidak ada cara yang baik untuk mencegah penggunaan fungsi yang tidak benar, dgn sengaja atau tidak

  • UKDW Struktur Data

    Contoh: Rekening Bank

    Kita akan pelajari implementasi rekening bank dgn C

    Rekening bank adalah sebuah struktur terdiri dari:

    Nomor rekening: integer

    Saldo: double, harus >= 0

    Operasi dasar:

    Penarikan

    Penyetoran

  • UKDW Struktur Data

    Implementasi Rekening Bank dgn C

    struct RekBank {

    int noRek;

    double saldo;

    };

    void bukaRek(RekBank* rekPtr, int nmr) {

    rekPtr->noRek = nmr;

    rekPtr->saldo = 0;

    }

    int ambil(RekBank* rekPtr, double jumlah) {

    if (rekPtr->saldo < jumlah)

    return 0;

    rekPtr->saldo -= jumlah;

    return 1;

    }

    void setor(RekBank* rekPtr, double jumlah) {

    rekPtr->saldo += jumlah;

    }

    ?

  • UKDW Struktur Data

    Implementasi Rekening Bank dgn C

    struct RekBank {

    int noRek;

    double saldo;

    };

    void bukaRek(RekBank* rekPtr, int nmr) {

    rekPtr->noRek = nmr;

    rekPtr->saldo = 0;

    }

    int ambil(RekBank* rekPtr, double jumlah) {

    if (rekPtr->saldo < jumlah)

    return 0;

    rekPtr->saldo -= jumlah;

    return 1;

    }

    void setor(RekBank* rekPtr, double jumlah) {

    rekPtr->saldo += jumlah;

    }

    0 berarti gagal, ambil lebih dari saldo

    1 berarti sukses

  • UKDW Struktur Data

    Implementasi Rekening Bank dgn C

    struct RekBank {

    int noRek;

    double saldo;

    };

    void bukaRek(RekBank* rekPtr, int nmr) {

    rekPtr->noRek = nmr;

    rekPtr->saldo = 0;

    }

    int ambil(RekBank* rekPtr, double jumlah) {

    if (rekPtr->saldo < jumlah)

    return 0;

    rekPtr->saldo -= jumlah;

    return 1;

    }

    void setor(RekBank* rekPtr, double jumlah) {

    rekPtr->saldo += jumlah;

    }

    Data

    Fungsi

  • UKDW Struktur Data

    Implementasi Rekening Bank dgn C

    Data dan fungsi:

    Data Fungsi

    diberikan ke

    mengubah

    RekBank

    ambil()

    setor()

    bukaRek()

  • UKDW Struktur Data

    Pemanggilan Fungsi

    RekBank rek1;

    bukaRek(&rek1, 12345);

    setor(&rek1, 1000.00);

    ambil(&rek1, 500.00);

    ambil(&rek1, 600.00);

    RekBank rek2;

    setor(&rek2, 1000.00);

    bukaRek(&rek2, 12345);

    rek2.noRek = 54321;

    rek2.saldo = 10000000.00;

    pemanggilan fungsi yg benar

  • UKDW Struktur Data

    Pemanggilan Fungsi

    RekBank rek1;

    bukaRek(&rek1, 12345);

    setor(&rek1, 1000.00);

    ambil(&rek1, 500.00);

    ambil(&rek1, 600.00);

    RekBank rek2;

    setor(&rek2, 1000.00);

    bukaRek(&rek2, 12345);

    rek2.noRek = 54321;

    rek2.saldo = 10000000.00;

    pemanggilan fungsi yg benar

    ?

  • UKDW Struktur Data

    Pemanggilan Fungsi

    RekBank rek1;

    bukaRek(&rek1, 12345);

    setor(&rek1, 1000.00);

    ambil(&rek1, 500.00);

    ambil(&rek1, 600.00);

    RekBank rek2;

    setor(&rek2, 1000.00);

    bukaRek(&rek2, 12345);

    rek2.noRek = 54321;

    rek2.saldo = 10000000.00;

    pemanggilan fungsi yg benar

    tidak inisialisasi dulu

  • UKDW Struktur Data

    Pemanggilan Fungsi

    RekBank rek1;

    bukaRek(&rek1, 12345);

    setor(&rek1, 1000.00);

    ambil(&rek1, 500.00);

    ambil(&rek1, 600.00);

    RekBank rek2;

    setor(&rek2, 1000.00);

    bukaRek(&rek2, 12345);

    rek2.noRek = 54321;

    rek2.saldo = 10000000.00;

    pemanggilan fungsi yg benar

    tidak inisialisasi dulu

    ?

  • UKDW Struktur Data

    Pemanggilan Fungsi

    RekBank rek1;

    bukaRek(&rek1, 12345);

    setor(&rek1, 1000.00);

    ambil(&rek1, 500.00);

    ambil(&rek1, 600.00);

    RekBank rek2;

    setor(&rek2, 1000.00);

    bukaRek(&rek2, 12345);

    rek2.noRek = 54321;

    rek2.saldo = 10000000.00;

    pemanggilan fungsi yg benar

    tidak inisialisasi dulu

    set saldo jadi 0

  • UKDW Struktur Data

    Pemanggilan Fungsi

    RekBank rek1;

    bukaRek(&rek1, 12345);

    setor(&rek1, 1000.00);

    ambil(&rek1, 500.00);

    ambil(&rek1, 600.00);

    RekBank rek2;

    setor(&rek2, 1000.00);

    bukaRek(&rek2, 12345);

    rek2.noRek = 54321;

    rek2.saldo = 10000000.00;

    pemanggilan fungsi yg benar

    tidak inisialisasi dulu

    set saldo jadi 0

    ?

  • UKDW Struktur Data

    Pemanggilan Fungsi

    RekBank rek1;

    bukaRek(&rek1, 12345);

    setor(&rek1, 1000.00);

    ambil(&rek1, 500.00);

    ambil(&rek1, 600.00);

    RekBank rek2;

    setor(&rek2, 1000.00);

    bukaRek(&rek2, 12345);

    rek2.noRek = 54321;

    rek2.saldo = 10000000.00;

    pemanggilan fungsi yg benar

    tidak inisialisasi dulu

    set saldo jadi 0

    merubah no rekening

  • UKDW Struktur Data

    Pemanggilan Fungsi

    RekBank rek1;

    bukaRek(&rek1, 12345);

    setor(&rek1, 1000.00);

    ambil(&rek1, 500.00);

    ambil(&rek1, 600.00);

    RekBank rek2;

    setor(&rek2, 1000.00);

    bukaRek(&rek2, 12345);

    rek2.noRek = 54321;

    rek2.saldo = 10000000.00;

    pemanggilan fungsi yg benar

    tidak inisialisasi dulu

    set saldo jadi 0

    merubah no rekening

    ?

  • UKDW Struktur Data

    Pemanggilan Fungsi

    RekBank rek1;

    bukaRek(&rek1, 12345);

    setor(&rek1, 1000.00);

    ambil(&rek1, 500.00);

    ambil(&rek1, 600.00);

    RekBank rek2;

    setor(&rek2, 1000.00);

    bukaRek(&rek2, 12345);

    rek2.noRek = 54321;

    rek2.saldo = 10000000.00;

    pemanggilan fungsi yg benar

    tidak inisialisasi dulu

    set saldo jadi 0

    merubah no rekening

    merubah saldo tanpa fungsi

  • UKDW Struktur Data

    Kerugian Bahasa Prosedural

    Sulit melindungi data dari modifikasi

    Sulit di-debug

    Sulit dikembangkan

    misal, ingin membuat tipe rekening bank baru: tabungan, deposito, ...

    tanpa mempengaruhi implementasi yang sudah ada

    tanpa mengulang data/operasi yang sama

  • UKDW Struktur Data

    Bahasa Object-Oriented

    Fitur utama:

    Encapsulation

    kelompokkan data dan fungsi yg berkaitan (class)

    sembunyikan detail internal dari pihak luar

    Inheritance

    gunakan implementasi yg ada untuk buat class baru

    ada relasi logis antar class (superclass, subclass)

    Polymorphism

    perilaku obyek sebuah class berubah tergantung tipe datanya

  • UKDW Struktur Data

    Implementasi OO Rekening Bank

    Encapsulation data dan fungsi pada obyek Rekening Bank

    Fungsi

    Data Obyek

    Rekening Bank

    bgmn akses data ?

  • UKDW Struktur Data

    Implementasi OO Rekening Bank

    Encapsulation data dan fungsi pada obyek Rekening Bank

    fungsi unt manipulasi data

    tidak ada akses langsung ke data

    Fungsi

    Data Obyek

    Rekening Bank

  • UKDW Struktur Data

    Class dan Obyek

    Class

    cetakan (template, blue print) untuk sebuah tipe obyek

    Obyek

    hasil instansiasi class

    entitas sesungguhnya, yang menggabungkan

    keadaan (state)

    perilaku (behavior)

  • UKDW Struktur Data

    Class, Obyek, Client

    Program Client (Pengguna)

    -berinteraksi dgn class dan object

    int main() { ...

  • UKDW Struktur Data

    Class, Obyek, Client

    Class

    -bgmn membuat (construct) object -apa kondisi awal object

    Program Client (Pengguna)

    -berinteraksi dgn class dan object

    int main() { ...

    menyuruh class buat obyek baru

    1

  • UKDW Struktur Data

    Class, Obyek, Client

    Class

    -bgmn membuat (construct) object -apa kondisi awal object

    Program Client (Pengguna)

    -berinteraksi dgn class dan object

    int main() { ...

    Obyek

    -data member -fungsi member

    Obyek Obyek Obyek

    menyuruh class buat obyek baru

    1

    2

    constructor

  • UKDW Struktur Data

    Class, Obyek, Client

    Class

    -bgmn membuat (construct) object -apa kondisi awal object

    Program Client (Pengguna)

    -berinteraksi dgn class dan object

    int main() { ...

    Obyek

    -data member -fungsi member

    Obyek Obyek Obyek

    menyuruh class buat obyek baru

    1

    2

    constructor

    interaksi lewat fungsi member

    3

  • UKDW Struktur Data

    Class

    Sebuah class terdiri dari member:

    Data member, juga disebut field atau attribute

    Function member, juga disebut operation atau method

    Fungsi Modifier/Setter: merubah nilai data member

    Fungsi Accessor/Getter: mengambil nilai data member

    Data member juga disebut instance variable

    sebab dimiliki setiap obyek (instance dr sebuah class)

    Data member dapat bertipe primitive atau bertipe class lain

  • UKDW Struktur Data

    Accessibility

    Data member dan fungsi dalam sebuah class dapat memiliki berbagai level accessibility / visibility

    Jika dideklarasikan dalam section public:

    dapat diakses oleh semua fungsi (didalam / diluar) class

    Jika dideklarasikan dalam section private:

    hanya dapat diakses oleh fungsi yang merupakan member dari class itu

    Umumnya:

    data member dideklarasikan private

    fungsi dideklarasikan public

  • UKDW Struktur Data

    Implementasi Rekening Bank dgn C++

    class RekBank {

    private:

    int _noRek;

    double _saldo;

    public:

    int ambil(double jumlah) {

    if (_saldo < jumlah)

    return 0;

    _saldo -= jumlah;

    return 1;

    }

    void setor(double jumlah) {

    _saldo += jumlah;

    }

    ...

    ?

    ?

  • UKDW Struktur Data

    Implementasi Rekening Bank dgn C++

    class RekBank {

    private:

    int _noRek;

    double _saldo;

    public:

    int ambil(double jumlah) {

    if (_saldo < jumlah)

    return 0;

    _saldo -= jumlah;

    return 1;

    }

    void setor(double jumlah) {

    _saldo += jumlah;

    }

    ...

    prefix _ unt nama data member agar mudah identifikasi

    mulai titik ini deklarasi private

    mulai titik ini deklarasi public

    fungsi member tanpa parameter pointer

  • UKDW Struktur Data

    Implementasi Rekening Bank dgn C++

    ...

    int getNoRek(double jumlah) {

    return _noRek;

    }

    double getSaldo(double jumlah) {

    return _saldo;

    }

    // void setNoRek(int noRek) {

    // _noRek = noRek;

    // }

    };

    seandainya diperbolehkan ubah nomor rekening dgn fungsi setter

    fungsi getter untuk akses data member

    diakhiri ;

  • UKDW Struktur Data

    Obyek

    Class mendefinisikan tipe data baru

    Ketika variabel bertipe sebuah class dideklarasikan:

    sebuah obyek dibentuk (diinstansiasi)

    obyek ini disebut instance dari class

    Unt akses data atau fungsi public dr sebuah obyek:

    gunakan operator dot .

    seperti akses field dlm sebuah struct

  • UKDW Struktur Data

    Contoh Program Pengguna Class RekBank

    // deklarasi class RekBank

    int main()

    {

    RekBank rek1;

    rek1.setor(1000.0);

    rek1.ambil(500.25);

    rek1._noRek = 1357;

    rek1._saldo = 10000000;

    }

    Bagaimana cara inisialisasi?

    ?

  • UKDW Struktur Data

    Contoh Program Pengguna Class RekBank

    // deklarasi class RekBank

    int main()

    {

    RekBank rek1;

    rek1.setor(1000.0);

    rek1.ambil(500.25);

    rek1._noRek = 1357;

    rek1._saldo = 10000000;

    }

    Bagaimana cara inisialisasi?

    gunakan fungsi public melalui obyek

  • UKDW Struktur Data

    Contoh Program Pengguna Class RekBank

    // deklarasi class RekBank

    int main()

    {

    RekBank rek1;

    rek1.setor(1000.0);

    rek1.ambil(500.25);

    rek1._noRek = 1357;

    rek1._saldo = 10000000;

    }

    Bagaimana cara inisialisasi?

    gunakan fungsi public melalui obyek

    ?

  • UKDW Struktur Data

    Contoh Program Pengguna Class RekBank

    // deklarasi class RekBank

    int main()

    {

    RekBank rek1;

    rek1.setor(1000.0);

    rek1.ambil(500.25);

    rek1._noRek = 1357;

    rek1._saldo = 10000000;

    }

    Bagaimana cara inisialisasi?

    gunakan fungsi public melalui obyek

    error, tidak bisa akses data private dr luar

  • UKDW Struktur Data

    Constructor

    Setiap class memiliki satu atau lebih method spesial yg dikenal sbg constructor

    unt inisialisasi data member

    dipanggil otomatis saat pembuatan obyek

    Default constructor

    tanpa parameter

    disediakan compiler otomatis bila class tdk ada constructor

    Non-default constructor

    dapat memiliki parameter

    dapat banyak constructor yg berbeda signature

    Data member yg tidak diinisialisasi berisi garbage

  • UKDW Struktur Data

    Dua Constructor RekBank

    class RekBank {

    public:

    RekBank(int nomor) {

    _noRek = nomor;

    _saldo = 0;

    }

    RekBank(int nomor, double jumlah)

    : _noRek(nomor), _saldo(jumlah)

    {

    }

    };

    ?

    ?

  • UKDW Struktur Data

    Dua Constructor RekBank

    class RekBank {

    public:

    RekBank(int nomor) {

    _noRek = nomor;

    _saldo = 0;

    }

    RekBank(int nomor, double jumlah)

    : _noRek(nomor), _saldo(jumlah)

    {

    }

    };

    constructor bernama sama dgn class, tanpa return type

    syntax alternatif unt inisialisasi data member dgn initializer list

  • UKDW Struktur Data

    Pembuatan Obyek RekBank

    int main()

    {

    RekBank rek1(1234);

    RekBank rek2(1235, 500.00);

    }

    ? ?

  • UKDW Struktur Data

    Pembuatan Obyek RekBank

    int main()

    {

    RekBank rek1(1234);

    RekBank rek2(1235, 500.00);

    }

    dgn constructor 1

    dgn constructor 2

  • UKDW Struktur Data

    Obyek dalam Memory

    class RekBank {

    ...

    int ambil(double jumlah) {

    if (_saldo < jumlah)

    return 0;

    _saldo -= jumlah;

    return 1;

    }

    };

    int main() {

    RekBank rek1(1234, 300.50);

    RekBank rek2(9999, 512.25);

    rek1.ambil(100.00);

    rek2.ambil(100.00);

    }

    ?

    ?

  • UKDW Struktur Data

    Obyek dalam Memory

    class RekBank {

    ...

    int ambil(double jumlah) {

    if (_saldo < jumlah)

    return 0;

    _saldo -= jumlah;

    return 1;

    }

    };

    int main() {

    RekBank rek1(1234, 300.50);

    RekBank rek2(9999, 512.25);

    rek1.ambil(100.00);

    rek2.ambil(100.00);

    }

    1234

    300.50

    _noRek

    _saldo rek1

    9999

    512.25

    _noRek

    _saldo rek2

  • UKDW Struktur Data

    Obyek dalam Memory

    class RekBank {

    ...

    int ambil(double jumlah) {

    if (_saldo < jumlah)

    return 0;

    _saldo -= jumlah;

    return 1;

    }

    };

    int main() {

    RekBank rek1(1234, 300.50);

    RekBank rek2(9999, 512.25);

    rek1.ambil(100.00);

    rek2.ambil(100.00);

    }

    1234

    300.50

    _noRek

    _saldo rek1

    9999

    512.25

    _noRek

    _saldo rek2

    ?

  • UKDW Struktur Data

    Obyek dalam Memory

    class RekBank {

    ...

    int ambil(double jumlah) {

    if (_saldo < jumlah)

    return 0;

    _saldo -= jumlah;

    return 1;

    }

    };

    int main() {

    RekBank rek1(1234, 300.50);

    RekBank rek2(9999, 512.25);

    rek1.ambil(100.00);

    rek2.ambil(100.00);

    }

    1234

    200.50

    _noRek

    _saldo rek1

    9999

    512.25

    _noRek

    _saldo rek2

  • UKDW Struktur Data

    Obyek dalam Memory

    class RekBank {

    ...

    int ambil(double jumlah) {

    if (_saldo < jumlah)

    return 0;

    _saldo -= jumlah;

    return 1;

    }

    };

    int main() {

    RekBank rek1(1234, 300.50);

    RekBank rek2(9999, 512.25);

    rek1.ambil(100.00);

    rek2.ambil(100.00);

    }

    1234

    200.50

    _noRek

    _saldo rek1

    9999

    512.25

    _noRek

    _saldo rek2

    ?

  • UKDW Struktur Data

    Obyek dalam Memory

    class RekBank {

    ...

    int ambil(double jumlah) {

    if (_saldo < jumlah)

    return 0;

    _saldo -= jumlah;

    return 1;

    }

    };

    int main() {

    RekBank rek1(1234, 300.50);

    RekBank rek2(9999, 512.25);

    rek1.ambil(100.00);

    rek2.ambil(100.00);

    }

    1234

    200.50

    _noRek

    _saldo rek1

    9999

    412.25

    _noRek

    _saldo rek2

  • UKDW Struktur Data

    this

    Saat memanggil rek1.ambil(),

    sebuah pointer konstan this akan menunjuk pada obyek yang sedang aktif, yaitu rek1

    Semua data/fungsi dari obyek tsb diakses secara implisit melalui pointer this ini

    misal, pada fungsi ambil(), saat menspesifikasi _saldo, yang diakses adalah this->_saldo

  • UKDW Struktur Data

    Obyek dalam Memory

    class RekBank {

    ...

    int ambil(double jumlah) {

    if (_saldo < jumlah)

    return 0;

    _saldo -= jumlah;

    return 1;

    }

    };

    int main() {

    RekBank rek1(1234, 300.50);

    RekBank rek2(9999, 512.25);

    rek1.ambil(100.00);

    rek2.ambil(100.00);

    }

    1234

    200.50

    _noRek

    _saldo rek1

    9999

    512.25

    _noRek

    _saldo rek2

    this

  • UKDW Struktur Data

    Obyek dalam Memory

    class RekBank {

    ...

    int ambil(double jumlah) {

    if (_saldo < jumlah)

    return 0;

    _saldo -= jumlah;

    return 1;

    }

    };

    int main() {

    RekBank rek1(1234, 300.50);

    RekBank rek2(9999, 512.25);

    rek1.ambil(100.00);

    rek2.ambil(100.00);

    }

    1234

    200.50

    _noRek

    _saldo rek1

    9999

    412.25

    _noRek

    _saldo rek2

    this

  • UKDW Struktur Data

    Object Passing

    Obyek biasanya berisi banyak data member, agar lebih efisien gunakan pass by reference ke fungsi

    void transfer(RekBank& rekAsal, RekBank& rekTuj, double jml)

    {

    }

    int main()

    {

    RekBank rek1(1234, 1000.0), rek2(1235, 2000.0);

    transfer(rek2, rek1, 500.0);

    }

    ?

  • UKDW Struktur Data

    Object Passing

    Obyek biasanya berisi banyak data member, agar lebih efisien gunakan pass by reference ke fungsi

    void transfer(RekBank& rekAsal, RekBank& rekTuj, double jml)

    {

    rekAsal.ambil(jml);

    rekTuj.setor(jml);

    }

    int main()

    {

    RekBank rek1(1234, 1000.0), rek2(1235, 2000.0);

    transfer(rek2, rek1, 500.0);

    }

  • UKDW Struktur Data

    Fungsi Global

    Fungsi global adl fungsi yg diimplementasikan di luar class

    contoh: fungsi main()

    fungsi transfer pd slide sebelumnya

    disebut juga fungsi bebas (unattached function)

  • UKDW Struktur Data

    Modular Design pada C++

    Tidak baik menempatkan semua dalam satu file

    deklarasi, implementasi, pemakaian/testing sebuah class dalam satu file bukan merupakan praktek yang baik

    Mudah untuk ditulis, namun sulit untuk pemakaian kembali (reuse) class

  • UKDW Struktur Data

    Modular Design pada C++

    Suatu class A dapat dibagi menjadi 2 bagian:

    1. Header File A.h

    Berisi hanya data member dan deklarasi fungsi member class A

    2. Source File A.cpp

    Berisi implementasi dari fungsi class A

    Semua program client yg menggunakan class A akan

    #include "X.h"

  • UKDW Struktur Data

    C++ Preprocessor Preprocessor : bagian dari proses compilation pd C++,

    ditandai dgn #, memodifikasi source code sebelum di-compile

    #include masukkan isi file library ke dlm file ini

    #include "namafile.h" masukkan isi file user dlm file ini

    #define nama [nilai] mendefinisikan suatu simbol nama

    #if kondisi cek kondisi, lanjut bila true

    #else bila kondisi false

    #elif kondisi else if

    #endif akhiri if atau if else

    #ifdef nama true apabila nama sudah didefinisikan

    #ifndef nama true apabila nama belum didefinisikan

    #undef nama menghapus simbol nama

  • UKDW Struktur Data

    Mencegah Include Berulang-kali

    Saat sebuah header file dari suatu class di-include beberapa kali, suatu class didefinisikan lebih dari sekali

    ERROR !

  • UKDW Struktur Data

    Mencegah Include Berulang-kali

    Saat sebuah header file dari suatu class di-include beberapa kali, suatu class didefinisikan lebih dari sekali

    ERROR !

    Gunakan header guard unt memastikan setiap class didefinisikan hanya sekali :

    misal nama file myclass.h, gunakan nama MYCLASS_H dalam header guard file tersebut

    #ifndef MYCLASS_H

    #define MYCLASS_H

    // Deklarasi class

    #endif

  • UKDW Struktur Data

    Header File: RekBank.h

    #ifndef REKBANK_H #define REKBANK_H class RekBank {

    private: int _noRek; double _saldo;

    public: RekBank(int); RekBank(int, double); int ambil(double); void setor(double); int getNoRek() const; double getSaldo() const; }; #endif

    ?

    ?

  • UKDW Struktur Data

    Header File: RekBank.h

    #ifndef REKBANK_H #define REKBANK_H class RekBank {

    private: int _noRek; double _saldo;

    public: RekBank(int); RekBank(int, double); int ambil(double); void setor(double); int getNoRek() const; double getSaldo() const; }; #endif

    header file hanya berisi deklarasi, tanpa implementasi penuh

    fungsi constant tidak akan merubah state obyek

    prototipe fungsi, tidak perlu nama parameter, diakhiri ;

    akhiri deklarasi class dgn ;

  • UKDW Struktur Data

    Implementation File: RekBank.cpp

    #include "RekBank.h"

    RekBank::RekBank(int nomor)

    { ... }

    RekBank::RekBank(int nomor, double jumlah)

    { ... }

    int RekBank::ambil(double jumlah)

    { ... }

    void RekBank::setor(double jumlah)

    { ... }

    int RekBank::getNoRek() const

    { ... }

    double RekBank::getSaldo() const

    { ... }

    ?

    ?

    ?

  • UKDW Struktur Data

    Implementation File: RekBank.cpp

    #include "RekBank.h"

    RekBank::RekBank(int nomor)

    { ... }

    RekBank::RekBank(int nomor, double jumlah)

    { ... }

    int RekBank::ambil(double jumlah)

    { ... }

    void RekBank::setor(double jumlah)

    { ... }

    int RekBank::getNoRek() const

    { ... }

    double RekBank::getSaldo() const

    { ... }

    include header file

    RekBank:: memberitahu compiler fungsi ini milik class RekBank

    RekBank:: diletakkan sebelum nama method

    jadikan semua fungsi accessor/getter fungsi konstan

  • UKDW Struktur Data

    Program Client

    Program yg gunakan class harus include header file

    bukan implementation file

    // ClientRekBank1.cpp

    #include

    #include "RekBank.h"

    using namespace std;

    int main() {

    RekBank rek1(1234, 300.50);

    RekBank rek2(9999, 512.25);

    rek1.ambil(100.00);

    rek2.ambil(100.00);

    return 0;

    }

  • UKDW Struktur Data

    Ingat const Keyword const menandakan suatu nilai yang tidak boleh

    berubah, contoh:

    const int x = 5; // x akan selalu bernilai 5

    void foo(const string& s) { ...

    // fungsi foo tidak akan merubah s

    Fungsi member const tidak akan merubah data member obyek (kondisi/state obyek), contoh:

    int getSaldo() const; // getSaldo tidak akan merubah obyek rekening

    pada obyek referensi konstan, misal const RekBank rek1 , hanya fungsi member konstan yang dapat dipanggil

  • UKDW Struktur Data

    Fungsi toString() Fungsi toString() berguna unt merepresentasikan

    obyek sbg string unt debugging dgn print data obyek suatu waktu

    pada RekBank.h :

    #ifndef REKBANK_H

    #define REKBANK_H

    #include

    using namespace std;

    class RekBank {

    ...

    public:

    ...

    string toString();

    };

    #endif

  • UKDW Struktur Data

    pada RekBank.cpp :

    #include "RekBank.h"

    #include

    ...

    string RekBank::toString() {

    ostringstream oss;

    oss

  • UKDW Struktur Data

    Program Pengguna Class RekBank

    // ClientRekBank2.cpp

    #include "RekBank.h"

    #include

    #include

    using namespace std;

    int main() {

    RekBank rek1(1234, 300.50);

    RekBank rek2(9999, 512.25);

    string infoRek;

    ofstream outFile("Rekening.txt");

    infoRek = rek1.toString();

    cout

  • UKDW Struktur Data

    Operator Overloading

    C++ memperbolehkan kita mendefinisikan ulang perilaku operator

    unary: + = ++ -- * & ! ~ new delete >

    binary: + - * / % += -= *= /= & | && || ^

    == != < > = = [] -> () ,

    Dapat menjadikan code lebih rumit

    overload operator jika memang diperlukan

  • UKDW Struktur Data

    Syntax Operator Overloading

    Deklarasi pada file .h

    tipereturn operator op(parameter);

    Implementasi pada file .cpp

    tipereturn operator op(parameter) {

    ...

    };

    dgn op adalah simbol operator seperti ==

    dan parameter adalah operand

    Contoh:

    a == b menjadi operator ==(RekBank a, RekBank b)

  • UKDW Struktur Data

    Contoh Operator Overloading

    // RekBank.h

    class RekBank {

    ...

    };

    bool operator ==(RekBank& rek1, RekBank& rek2);

    // RekBank.cpp

    bool operator ==(RekBank& rek1, RekBank& rek2) {

    return rek1.getNoRek() == rek2.getNoRek();

    }

    di luar deklarasi class

  • UKDW Struktur Data

    Contoh Operator Overloading

    // RekBank.h

    class RekBank {

    ...

    };

    bool operator ==(const RekBank& rek1, const RekBank& rek2);

    // RekBank.cpp

    bool operator ==(const RekBank& rek1, const RekBank& rek2) {

    return rek1.getNoRek() == rek2.getNoRek();

    }

    di luar deklarasi class

  • UKDW Struktur Data

    Obyek Dapat Diprint

    Menjadikan obyek dapat di-print dgn cout, overload operator

  • UKDW Struktur Data

    Contoh Overload Operator

  • UKDW Struktur Data

    Destructor Destructor adalah fungsi spesial yang dipanggil saat

    obyek dihapus

    1. saat obyek berada diluar scope (saat deklarasi obyek hingga akhir blok } dlm blok yg melingkupi obyek)

    2. saat obyek dihapus eksplisit dengan memanggil delete

    Syntax unt destructor

    nama destructor adl nama class diawali tilde ~

    tanpa parameter list, tanpa return type

    Hanya satu destructor setiap class

    Jika tidak diimplementasi,

    compiler akan otomatis menyediakan

    cukup bagi banyak kasus

  • UKDW Struktur Data

    Contoh Destructor

    // RekBank.h

    class RekBank {

    ...

    RekBank(int, double);

    ~RekBank();

    ...

    };

    // RekBank.cpp

    RekBank::~RekBank() {

    cout

  • UKDW Struktur Data

    Copy Constructor

    Copy constructor adalah constructor yang dipanggil saat pembuatan obyek baru dengan parameter obyek lain yang bertipe / dari class yang sama

    data member obyek lain tersebut dicopykan ke obyek baru

    Parameter copy constructor adalah

    referensi konstan obyek lain

    Dipanggil saat obyek baru pertama kali diinisialisasi

    secara eksplisit Class obyek1 = obyek2;

    Class obyek1(obyek2);

    secara implisit, misal saat pass by value, dimana obyek dicopy kedalam variabel parameter fungsi

  • UKDW Struktur Data

    Contoh Copy Constructor

    // RekBank.h

    class RekBank {

    ...

    RekBank(int, double);

    ~RekBank();

    RekBank(const RekBank& rekLain);

    ...

    };

    // RekBank.cpp

    RekBank::RekBank(const RekBank& rekLain) {

    _noRek = rekLain._noRek;

    _saldo = rekLain._saldo;

    }

    deklarasi copy constructor

    copy semua data member

  • UKDW Struktur Data

    Contoh Program Client // ClientRekBank3.cpp

    #include

    #include "RekBank.h"

    using namespace std;

    int main() {

    int noRek;

    double saldoAwal, setoran;

    cin >> noRek >> saldoAwal >> setoran;

    RekBank* rek1 = new RekBank(noRek, saldoAwal);

    rek1->setor(setoran);

    cout

  • UKDW Struktur Data

    Quiz

    Lengkapi class Tanggal yang terdiri dari

    header file Tanggal.h

    source file Tanggal.cpp

    sehingga program hitungHariUltah di slide setelah ini dapat menghasilkan output sebagai berikut

    Ulang tahun Anda pada bulan 3

    Ulang tahun Anda pada 23/3

    Ulang tahun Anda tinggal 26 hari lagi

    Obyek tanggal 23/3 dihapus

    Obyek tanggal 23/3 dihapus

  • UKDW Struktur Data

    hitungHariUltah.cpp

    #include

    #include "Tanggal.h"

    using namespace std;

    int main() {

    const Tanggal ultah(23, 3);

    Tanggal hariIni(25, 2);

    cout

  • UKDW Struktur Data

    tanggal.h

    #ifndef TANGGAL_H

    #define TANGGAL_H

    #include

    #include

    using namespace std;

    class Tanggal {

    public:

    Tanggal(int t, int b);

    Tanggal(const Tanggal& tgl);

    ~Tanggal();

    int hariPerBulan() const;

    int getTanggal() const;

    int getBulan() const;

    void tambahHari();

    private:

    int _bulan;

    int _tanggal;

    };

    bool operator ==(const Tanggal& tgl1, const Tanggal& tgl2);

    ostream& operator

  • UKDW Struktur Data

    tanggal.cpp (1)

    #include "Tanggal.h"

    Tanggal::Tanggal(int t, int b)

    {

    if (b > 0 && b < 13) {

    _bulan = b;

    }

    if (t > 0 && t

  • UKDW Struktur Data

    Tanggal::~Tanggal()

    {

    cout

  • UKDW Struktur Data

    void Tanggal::tambahHari() {

    _tanggal++;

    if (_tanggal > hariPerBulan()) {

    _bulan++;

    _tanggal = 1;

    if (_bulan > 12) {

    _bulan = 1;

    }

    }

    }

    bool operator ==(const Tanggal& tgl1, const Tanggal& tgl2) {

    return tgl1.getBulan() == tgl2.getBulan() &&

    tgl1.getTanggal() == tgl2.getTanggal();

    }

    ostream& operator

  • UKDW Struktur Data

    tanggal.h (solusi)

    #ifndef TANGGAL_H

    #define TANGGAL_H

    #include

    #include

    using namespace std;

    class Tanggal {

    public:

    Tanggal(int t, int b);

    Tanggal(const Tanggal& tgl);

    ~Tanggal();

    int hariPerBulan() const;

    int getTanggal() const;

    int getBulan() const;

    void tambahHari();

    private:

    int _bulan;

    int _tanggal;

    };

    bool operator ==(const Tanggal& tgl1, const Tanggal& tgl2);

    ostream& operator

  • UKDW Struktur Data

    tanggal.cpp (solusi)

    #include "Tanggal.h"

    Tanggal::Tanggal(int t, int b)

    {

    if (b > 0 && b < 13) {

    _bulan = b;

    }

    if (t > 0 && t

  • UKDW Struktur Data

    Tanggal::~Tanggal()

    {

    cout

  • UKDW Struktur Data

    void Tanggal::tambahHari() {

    _tanggal++;

    if (_tanggal > hariPerBulan()) {

    _bulan++;

    _tanggal = 1;

    if (_bulan > 12) {

    _bulan = 1;

    }

    }

    }

    bool operator ==(const Tanggal& tgl1, const Tanggal& tgl2) {

    return tgl1.getBulan() == tgl2.getBulan() &&

    tgl1.getTanggal() == tgl2.getTanggal();

    }

    ostream& operator

  • UKDW Struktur Data

    Minggu Depan

    Bahan minggu depan Inheritance, Polymorphism, dan Exception :

    Inheritance, Multiple Inheritance

    Function Overriding

    Virtual Function, Abstract Class

    Exception Signaling dan Handling

    Baca :

    Textbook A C++ Interlude 1, 2, 3, 4 Appendix A.8

    Textbook C Chapter 16

    Chapter 12