# Class
## Class
Class adalah pengembangan dari konsep struktur data: seperti struktur data, class dapat memiliki member-memvber data, tetapi mereka juga dapat memiliki fungsi-fungsi sebagai member.
Sebuah object adalah instansiasi dari sebuah class. Dalam kaitannya dengan variabel, sebuah class adalah tipe dan sebuah object adalah variabel.
Class didefinisikan dengan keyword `class` atau keyword `struct`, dengan syntax berikut:
```cpp
class nama_class {
access_specifier_1:
member1;
access_specifier_2:
member2;
...
} nama_object;
```
Dimana `nama_class` adalah identifier yang valid untuk nama class, `nama_object` adalah daftar nama dari object-object dari class ini. `nama_object` adalah opsional. Body dari deklarasi dapat berisi member-member, yang dapat berupa data atau deklarasi fungsi, dan atau secara opsional *access specifier*.
Class mempunyai format yahng sama seperti *struktur data* polos, hanya saja mereka dapat menyertakan fungsi-fungsi dan mempunyai ...
Specifier ini memodifikasi hak akses dari member-member yang mengikutinya:
- member `private` dari sebuah class hanya dapat diakses oleh member-member dalam class yang sama (atau dari fungsi atau class *friend*).
- member `protected` dapat diakses dari member-member lain dari class yang sama (atau dari fungsi atau class *friend*), dan juga member-member dari class-class turunan.
- member `public` dapat diakses darimanapun dimana object tersebut terlihat.
Secara default, semua member dari class dideklarasikan dengan keyword `class` mempunyai akses private untuk semua member-membernya. Maka, member-member yang dideklarasikan sebelaum access specifier lain mempunyai akses private secara otomatis. Sebagai contoh:
```cpp
class PersegiPanjang {
int lebar, panjang;
public:
void set_nilai(int, int);
int luas(void);
} persegi;
```
## Friendship dan Inheritance
Secara prinsip, member-member private dan protected dari sebuah class tidak dapat diakses dari luar class tempat mereka dideklarasikan. Namun, aturan ini tidak berlaku untuk "friends".
**Friends** adalah fungsi-fungsi atau class-class yang dideklarasikan dengan keyword `friend`.
Sebuah fungsi non-member dapat mengakses member-member private dan protected dari sebuah class jika fungsi tersebut dideklarasikan sebagai sebuah `friend` dari class tersebut. Ini dilakukan dengan menyertakan sebuah deklatasi dari fungsi eksternal ini dalam class, dan mendahuluinya denga keyword `friend`:
```cpp=
// Fungsi friend
#include <iostream>
using namespace std;
class PersegiPanjang {
int lebar, panjang;
public:
PersegiPanjang() {}
PersegiPanjang (int x, int y) : lebar(x), panjang(y) {}
int luas() { return lebar * panjang; }
friend PersegiPanjang duplicate (const PersegiPanjang&);
};
PersegiPanjang duplicate (const PersegiPanjang& param)
{
PersegiPanjang clone;
clone.lebar = param.lebar * 2;
clone.panjang = param.panjang * 2;
return clone;
}
int main() {
PersegiPanjang foo;
PersegiPanjang bar(2, 3);
foo = duplicate(bar);
cout << foo.luas() << '\n';
return 0;
}
```
Fungsi `duplicate` adalah *friend* dari class `PersegiPanjang`. Maka, fungsi `duplicate` dapat mengakses member `panjang` dan member `lebar` dari object-object dari tipe `PersegiPanjang`. Perhatikan