Inisialisasi Stack
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan C di Coddy. Pelajaran 14 dari 61.
Tidak semua object perlu disimpan di heap. Jika struct berukuran kecil dan masa hidupnya singkat, mengalokasikannya di stack lebih sederhana dan cepat: tanpa malloc, tanpa free, tanpa risiko kebocoran memori.
Alih-alih mengembalikan pointer, fungsi factory dapat mengembalikan struct berdasarkan nilai. Seluruh struct disalin ke pemanggil:
typedef struct {
int x;
int y;
} Point;
Point create_point(int x, int y) {
Point p;
p.x = x;
p.y = y;
return p;
}
Pemanggil menerima salinan yang sudah diinisialisasi sepenuhnya:
Point origin = create_point(0, 0);
Point cursor = create_point(100, 50);
printf("Cursor: (%d, %d)\n", cursor.x, cursor.y);
Tidak ada pointer, tidak perlu pembersihan. Saat origin dan cursor keluar dari cakupan, keduanya otomatis dihancurkan.
Pendekatan ini paling cocok untuk struct kecil tanpa anggota yang dialokasikan secara dinamis. Untuk object yang lebih besar atau yang berisi pointer ke memori heap, pola constructor dengan malloc tetap menjadi pilihan yang lebih baik.
Tantangan
MudahMari buat module Temperature yang membuat pembacaan suhu di stack menggunakan fungsi factory. Berbeda dari constructor berbasis heap pada pelajaran sebelumnya, pendekatan ini mengembalikan struct berdasarkan nilai: tanpa malloc, tanpa free, hanya alokasi stack yang sederhana dan efisien.
Kamu akan membuat tiga file:
temperature.h: Deklarasikan structTemperaturedengan dua anggota:double celsiusdanchar scale(untuk menyimpan 'C' sebagai penanda Celsius). Deklarasikan juga dua fungsi:create_temperature: menerima nilai double dan mengembalikan structTemperatureberdasarkan nilai (bukan pointer!)temperature_to_fahrenheit: menerimaconst Temperature *dan mengembalikan suhu setara dalam Fahrenheit sebagai double
TEMPERATURE_H.temperature.c: Implementasikan kedua fungsi. Fungsi factory-mu harus membuat variabelTemperaturelokal, menginisialisasi field-nya (aturscalemenjadi'C'), lalu mengembalikannya. Rumus konversinya adalah:fahrenheit = celsius * 9.0 / 5.0 + 32.0main.c: Gunakan fungsi factory-mu untuk membuat pembacaan suhu dan menampilkan nilai Celsius dan Fahrenheit.
Kamu akan menerima satu input: suhu dalam Celsius (sebagai double).
Di file utamamu, gunakan create_temperature untuk membuat struct Temperature dengan nilai yang diberikan. Lalu cetak nilai Celsius asli dan nilai setara Fahrenheit-nya.
Cetak output dalam format ini:
Celsius: {celsius}
Fahrenheit: {fahrenheit}Gunakan %.2f untuk kedua nilai agar menampilkan dua angka di belakang koma.
Misalnya, dengan input 25.0, outputnya akan menjadi:
Celsius: 25.00
Fahrenheit: 77.00Perhatikan betapa rapi pendekatan ini. Kamu menerima struct yang sudah sepenuhnya diinisialisasi tanpa perlu mengkhawatirkan pengelolaan memori. Saat variabel Temperature-mu keluar dari cakupan, variabel itu otomatis dibersihkan.
Coba sendiri
#include <stdio.h>
#include "temperature.h"
int main() {
double celsius_input;
scanf("%lf", &celsius_input);
// TODO: Gunakan create_temperature untuk membuat struct Temperature
// TODO: Cetak nilai Celsius dengan format %.2f
// TODO: Gunakan temperature_to_fahrenheit untuk mengonversi dan mencetak nilai Fahrenheit
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