---
# System prepended metadata

title: Class

---

# 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 