Menu
CoddyTech

Fungsi anggota const

Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan C++ di Coddy. Pelajaran 29 dari 104.

Kamu sudah melihat kata kunci const pada getter method di pelajaran sebelumnya. Namun, apa sebenarnya arti const ketika muncul setelah daftar parameter fungsi? Fungsi anggota const berjanji untuk tidak mengubah variabel anggota apa pun dari object.

class Rectangle {
    int width;
    int height;
public:
    Rectangle(int w, int h) : width(w), height(h) {}
    
    int getArea() const {      // fungsi anggota const
        return width * height;  // Membaca anggota diperbolehkan
    }
    
    void setWidth(int w) {     // Non-const, mengubah object
        width = w;
    }
};

const setelah daftar parameter memberi tahu compiler: "Fungsi ini tidak akan mengubah state object." Jika kamu mencoba mengubah variabel anggota di dalam fungsi const, compiler akan menghasilkan error.

Hal ini menjadi penting saat bekerja dengan object const atau referensi const. Object const hanya dapat memanggil fungsi anggota const:

void printArea(const Rectangle& rect) {
    std::cout << rect.getArea();    // OK, getArea() bersifat const
    // rect.setWidth(10);           // ERROR, setWidth() tidak bersifat const
}

Menandai fungsi dengan const saat fungsi tersebut tidak mengubah object adalah praktik yang baik. Ini mendokumentasikan maksudmu, memungkinkan fungsi bekerja dengan object const, dan membantu compiler mendeteksi perubahan yang tidak disengaja. Setiap fungsi anggota yang hanya membaca data sebaiknya ditandai const.

challenge icon

Tantangan

Mudah

Mari kita buat konverter suhu yang menunjukkan kapan dan mengapa kamu perlu menggunakan fungsi anggota const. Kamu akan membuat class dengan beberapa method yang hanya membaca data (dan sebaiknya diberi const), sementara method lainnya mengubah state object.

Kamu akan membuat dua file untuk mengatur kodemu:

  • Temperature.h: Definisikan class Temperature yang menyimpan nilai suhu dan menyediakan berbagai cara untuk membaca serta mengubahnya. Class-mu harus memiliki:
    • Anggota privat celsius (double) untuk menyimpan suhu
    • Konstruktor yang menerima nilai awal Celsius
    • Method getCelsius() yang mengembalikan nilai yang disimpan. Method ini harus const karena hanya membaca data
    • Method getFahrenheit() yang menghitung dan mengembalikan suhu dalam Fahrenheit menggunakan rumus celsius * 9.0 / 5.0 + 32.0, dan juga const karena tidak mengubah apa pun
    • Method getKelvin() yang mengembalikan suhu dalam Kelvin menggunakan celsius + 273.15, dan juga harus const
    • Method setCelsius(double value) yang memperbarui suhu yang disimpan. Method ini tidak bisa const karena mengubah object
    • Method adjustBy(double delta) yang menambahkan delta ke suhu saat ini, dan juga tidak const
  • main.cpp: Tunjukkan cara kerja fungsi anggota const dengan object biasa dan const. Baca nilai suhu awal dari input, lalu:
    • Buat object Temperature dengan nilai input
    • Cetak "Initial: <celsius>C = <fahrenheit>F = <kelvin>K"
    • Sesuaikan suhu sebesar 10.0 derajat
    • Cetak "After adjustment: <celsius>C"
    • Buat fungsi pembantu void printReadings(const Temperature& temp) yang menerima referensi const dan mencetak "Reading: <celsius>C, <fahrenheit>F". Fungsi ini hanya bisa memanggil method const pada temp
    • Panggil printReadings() dengan object suhu milikmu
    • Atur suhu ke 0.0 (titik beku)
    • Cetak "Freezing point: <celsius>C = <fahrenheit>F"

Format semua nilai suhu dengan satu angka di belakang koma menggunakan std::fixed dan std::setprecision(1) dari <iomanip>.

Hal penting yang perlu dipahami adalah printReadings() menerima referensi const, jadi fungsi ini hanya bisa memanggil method yang ditandai sebagai const. Karena itu, getter-mu perlu ditandai sebagai const dengan benar. Dengan begitu, getter dapat digunakan dalam konteks ketika object tidak boleh diubah.

Coba sendiri

#include <iostream>
#include <iomanip>
#include "Temperature.h"
using namespace std;

// TODO: Implementasikan method class Temperature di sini
// Konstruktor
Temperature::Temperature(double initialCelsius) {
    // TODO: Inisialisasi celsius
}

// TODO: Implementasikan getCelsius() sebagai const

// TODO: Implementasikan getFahrenheit() sebagai const

// TODO: Implementasikan getKelvin() sebagai const

// TODO: Implementasikan setCelsius(double value)

// TODO: Implementasikan adjustBy(double delta)


// TODO: Buat fungsi pembantu printReadings yang menerima const Temperature& 
// dan mencetak "Reading: <celsius>C, <fahrenheit>F"
// Catatan: Fungsi ini hanya boleh memanggil method const pada temp!


int main() {
    double initialTemp;
    cin >> initialTemp;

    // Atur format output
    cout << fixed << setprecision(1);

    // TODO: Buat object Temperature dengan nilai input

    // TODO: Cetak "Initial: <celsius>C = <fahrenheit>F = <kelvin>K"

    // TODO: Ubah suhu sebesar 10.0 derajat

    // TODO: Cetak "After adjustment: <celsius>C"

    // TODO: Panggil printReadings() dengan object suhumu

    // TODO: Atur suhu ke 0.0 (titik beku)

    // TODO: Cetak "Freezing point: <celsius>C = <fahrenheit>F"

    return 0;
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Object

Latihan sendiri: Compiler C++ online