03 Fitur Object-Oriented C++ full
-
Upload
widnyana-santika -
Category
Documents
-
view
22 -
download
5
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