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.
Tantangan
MudahMari 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 classTemperatureyang 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 rumuscelsius * 9.0 / 5.0 + 32.0, dan juga const karena tidak mengubah apa pun - Method
getKelvin()yang mengembalikan suhu dalam Kelvin menggunakancelsius + 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
- Anggota privat
main.cpp: Tunjukkan cara kerja fungsi anggota const dengan object biasa dan const. Baca nilai suhu awal dari input, lalu:- Buat object
Temperaturedengan nilai input - Cetak
"Initial: <celsius>C = <fahrenheit>F = <kelvin>K" - Sesuaikan suhu sebesar
10.0derajat - 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"
- Buat object
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;
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Object
1Dasar-Dasar OOP
File EksternalBuild dan Kompilasi C++File Header dan File SourceNamespace dan CakupanPengantar OOP dalam C++class vs objectPointer 'this'method (Fungsi Anggota)Atribut (Anggota Data)Dasar Ctor dan DtorRingkasan: Kalkulator Sederhana4Properti class
Anggota instance vs staticGetter dan setterFungsi anggota constKata kunci mutableMethod dan variabel staticFungsi dan class friendRangkuman, Pengelola Rekening Bank7Pewarisan
Pewarisan DasarTingkat Akses pada PewarisanUrutan Pemanggilan Ctor & DtorPenimpaan methodFungsi Virtual & VTablePewarisan BergandaPewarisan VirtualRangkuman: Hierarki Karyawan2Manajemen Memori
Memori Stack vs HeapPointer dan ReferenceMemori Dinamis (new/delete)Smart Pointer di C++RAII di C++Rangkuman: Pengelola Array Dinamis5Enkapsulasi
Penentu Akses dalam C++Penentu Akses secara MendalamPenyembunyian Informasistruct vs classNested dan Inner classRangkuman, Sistem Catatan Siswa8Polimorfisme
Polimorfisme saat Compile vs RuntimeOverloading FungsiMeninjau Kembali Fungsi VirtualFungsi Virtual MurniKelas AbstrakDesain Interface di C++Casting Dinamis & RTTIRangkuman: Kalkulator Bentuk3Konstruktor & Destruktor
Konstruktor DefaultKonstruktor BerparameterKonstruktor SalinKonstruktor PindahDaftar Inisialisasi KonstruktorKonstruktor DelegasiKupas Tuntas DestruktorAturan Tiga, Lima, dan NolRangkuman: class String6Overloading Operator
Pengantar Overloading OperatorOverloading Operator AritmetikaOverloading Operator PerbandinganOperator StreamOverloading Operator PenugasanOverloading Operator [] dan ()Operator Konversi TipeRingkasan, class Matrix9Template
Template FungsiTemplate classSpesialisasi TemplateTemplate VariadikDasar SFINAE & Type TraitsRangkuman, Container GenerikLatihan sendiri: Compiler C++ online