Konsistensi const
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan C di Coddy. Pelajaran 8 dari 61.
Saat menulis fungsi yang bertindak sebagai method, beberapa fungsi seharusnya mengubah object (seperti player_take_damage), sedangkan fungsi lainnya hanya membaca data tanpa mengubah apa pun. Kata kunci const memungkinkanmu menegakkan perbedaan ini pada tingkat compiler.
Dengan menandai parameter pointer sebagai const, kamu menjamin bahwa fungsi tidak akan mengubah data yang ditunjuknya. Jika kamu tidak sengaja mencoba mengubah sebuah anggota, compiler akan menghasilkan error:
typedef struct {
int x;
int y;
} Point;
// Fungsi ini hanya dapat MEMBACA point
void point_print(const Point *self) {
printf("(%d, %d)\n", self->x, self->y);
// self->x = 10; // ERROR: tidak dapat mengubah melalui pointer const
}
// Fungsi ini dapat MENGUBAH point
void point_move(Point *self, int dx, int dy) {
self->x += dx;
self->y += dy;
}
Parameter const Point *self memberi tahu compiler dan programmer lain bahwa point_print adalah operasi "getter" atau hanya-baca. Ini disebut ketepatan const: menggunakan const di mana pun perubahan tidak diperlukan.
Latihan ini menemukan bug sejak awal. Jika kamu menulis fungsi display dan tanpa sengaja mengubah sebuah field, compiler akan langsung menghentikanmu agar bug itu tidak lolos ke dalam programmu.
Tantangan
MudahMari buat module Temperature yang menyimpan nilai suhu dan menyediakan operasi hanya-baca serta operasi yang mengubah data. Ini akan membantumu berlatih menggunakan pointer const untuk membedakan dengan jelas fungsi yang hanya membaca data dan fungsi yang mengubahnya.
Kamu akan membuat tiga file:
temperature.h: Deklarasikan structTemperaturedengan satu anggotadouble celsius. Deklarasikan juga tiga fungsi:temp_display: menerima pointerconstke Temperature dan mencetak suhu saat ini (hanya-baca)temp_adjust: menerima pointer biasa ke Temperature dan nilai double, lalu menambahkan nilai tersebut ke celsius (mengubah data)temp_to_fahrenheit: menerima pointerconstke Temperature dan mengembalikan nilai yang dikonversi ke Fahrenheit (hanya-baca)
TEMPERATURE_H.temperature.c: Implementasikan ketiga fungsi. Fungsitemp_displayharus mencetak dengan formatCurrent: {celsius}C. Fungsitemp_to_fahrenheitharus mengembalikancelsius * 9.0 / 5.0 + 32.0. Ingat, fungsi yang menggunakan pointerconsttidak dapat mengubah data struct.main.c: Buat Temperature, lakukan operasi, lalu tampilkan hasilnya.
Kamu akan menerima dua input: nilai celsius awal (sebagai double) dan jumlah penyesuaian (sebagai double).
Di file utamamu:
- Inisialisasi
Temperaturedengan nilai celsius awal - Panggil
temp_displayuntuk menampilkan suhu awal - Panggil
temp_adjustuntuk mengubah suhu sebesar jumlah penyesuaian - Panggil
temp_displaylagi untuk menampilkan suhu yang telah diperbarui - Cetak konversi Fahrenheit menggunakan
temp_to_fahrenheit
Cetak hasil dengan format berikut:
Current: {celsius}C
Current: {celsius}C
Fahrenheit: {fahrenheit}FGunakan %.1f untuk semua nilai suhu agar ditampilkan dengan satu angka di belakang koma.
Contohnya, dengan nilai awal 20.0 dan penyesuaian 5.0, outputnya adalah:
Current: 20.0C
Current: 25.0C
Fahrenheit: 77.0FCoba sendiri
#include <stdio.h>
#include "temperature.h"
int main() {
double initial_celsius, adjustment;
scanf("%lf", &initial_celsius);
scanf("%lf", &adjustment);
// TODO: Buat struct Temperature dan inisialisasi dengan initial_celsius
// TODO: Panggil temp_display untuk menampilkan suhu awal
// TODO: Panggil temp_adjust untuk mengubah suhu sebesar nilai adjustment
// TODO: Panggil temp_display lagi untuk menampilkan suhu yang sudah diperbarui
// TODO: Cetak hasil konversi ke Fahrenheit menggunakan temp_to_fahrenheit
// Format: "Fahrenheit: %.1fF\n"
return 0;
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar Pemrograman Modular
file headerProteksi includefile sumberFungsi StatisRingkasan: Kalkulator Modular4Enkapsulasi
Konsep Opaque PointerMendefinisikan Opaque StructGetter dan SetterValidasi pada SetterUlasan: Kotak Rahasia2Object dan method
Struct sebagai objectPointer 'self'Konsistensi constPointer vs nilaiMethod pembantuRangkuman: Pengelola Point5Proyek: Akun Bank Sederhana
Penyiapan ProyekImplementasi Akun3Siklus Hidup object
Pola KonstruktorPola DestruktorInisialisasi StackSalinan MendalamRangkuman: Pembungkus string6Pewarisan melalui Komposisi
Penyematan StructAturan Anggota PertamaMengakses Anggota ParentUpcastingRekap: Hierarki Bentuk9Proyek: Penggambar Bentuk
Ringkasan ProyekImplementasi LingkaranImplementasi Persegi PanjangPenggunaan PolimorfismeWadah BentukLatihan sendiri: Compiler C online