Stack İlklendirme
Coddy'nin C Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 14 / 61.
Her nesnenin heap üzerinde bulunması gerekmez. Bir struct küçük olduğunda ve kısa bir ömre sahip olduğunda, onu stack üzerinde tahsis etmek daha basit ve daha hızlıdır—malloc yok, free yok, bellek sızıntısı riski yok.
Bir işaretçi döndürmek yerine, bir fabrika fonksiyonu yapıyı değer ile döndürebilir. Yapının tamamı çağırana kopyalanır:
typedef struct {
int x;
int y;
} Point;
Point create_point(int x, int y) {
Point p;
p.x = x;
p.y = y;
return p;
}
Çağıran, tam olarak başlatılmış bir kopya alır:
Point origin = create_point(0, 0);
Point cursor = create_point(100, 50);
printf("Cursor: (%d, %d)\n", cursor.x, cursor.y);
İşaretçi yok, temizlik gerekmez. origin ve cursor kapsam dışına çıktığında, otomatik olarak yok edilirler.
Bu yaklaşım, dinamik olarak ayrılmış üyelere sahip olmayan küçük struct'lar için en iyi sonucu verir. Daha büyük nesneler veya heap belleğine işaretçiler içerenler için, malloc ile oluşturulan yapıcı (constructor) deseni daha iyi bir seçim olmaya devam eder.
Görev
KolayBir fabrika fonksiyonu kullanarak yığında (stack) sıcaklık ölçümleri oluşturan bir Temperature modülü oluşturalım. Önceki derslerdeki yığın (heap) tabanlı kurucuların aksine, bu yaklaşım yapıyı değer olarak döndürür; malloc yok, free yok, sadece basit ve verimli yığın tahsisi.
Üç dosya oluşturacaksınız:
temperature.h: İki üyeli birTemperatureyapısı (struct) bildirin:double celsiusvechar scale(Santigrat için 'C' saklamak üzere). Ayrıca iki fonksiyon bildirin:create_temperature— bir double değer alır ve birTemperatureyapısını değer olarak döndürür (işaretçi değil!)temperature_to_fahrenheit— birconst Temperature *alır ve eşdeğer sıcaklığı Fahrenheit cinsinden double olarak döndürür
TEMPERATURE_Hsembolü ile include guard kullanın.temperature.c: Her iki fonksiyonu da uygulayın. Fabrika fonksiyonunuz yerel birTemperaturedeğişkeni oluşturmalı, alanlarını başlatmalı (scaledeğerini'C'olarak ayarlamalı) ve onu döndürmelidir. Dönüşüm formülü şöyledir:fahrenheit = celsius * 9.0 / 5.0 + 32.0main.c: Bir sıcaklık ölçümü oluşturmak için fabrika fonksiyonunuzu kullanın ve hem Celsius hem de Fahrenheit değerlerini görüntüleyin.
Bir girdi alacaksınız: Celsius cinsinden sıcaklık (double olarak).
Ana dosyanızda, verilen değerle bir Temperature yapısı oluşturmak için create_temperature kullanın. Ardından orijinal Celsius değerini ve Fahrenheit karşılığını yazdırın.
Çıktıyı şu formatta yazdırın:
Celsius: {celsius}
Fahrenheit: {fahrenheit}Her iki değer için de iki ondalık basamak görüntülemek üzere %.2f kullanın.
Örneğin, 25.0 girdisi ile çıktı şöyle olacaktır:
Celsius: 25.00
Fahrenheit: 77.00Bu yaklaşımın ne kadar temiz olduğuna dikkat edin; herhangi bir bellek yönetimi endişesi olmadan tam olarak başlatılmış bir yapı alırsınız. Temperature değişkeniniz kapsam dışına çıktığında, otomatik olarak temizlenir.
Kopya kağıdı
Fabrika fonksiyonları, struct'ları işaretçiler yerine değerine göre döndürebilir. Bu, struct'ı yığında (stack) tahsis eder; malloc yok, free yok ve bellek sızıntısı yok.
Değerine göre döndüren bir fabrika fonksiyonu örneği:
typedef struct {
int x;
int y;
} Point;
Point create_point(int x, int y) {
Point p;
p.x = x;
p.y = y;
return p;
}
Fabrika fonksiyonunun kullanımı:
Point origin = create_point(0, 0);
Point cursor = create_point(100, 50);
printf("Cursor: (%d, %d)\n", cursor.x, cursor.y);
Struct, çağıran tarafa kopyalanır ve kapsam dışına çıktığında otomatik olarak yok edilir. Bu yaklaşım, dinamik olarak tahsis edilmiş üyeleri olmayan küçük struct'lar için en iyi sonucu verir.
Kendin dene
#include <stdio.h>
#include "temperature.h"
int main() {
double celsius_input;
scanf("%lf", &celsius_input);
// TODO: Bir Temperature struct'ı oluşturmak için create_temperature kullanın
// TODO: Celsius değerini %.2f formatını kullanarak yazdırın
// TODO: Fahrenheit değerini dönüştürmek ve yazdırmak için temperature_to_fahrenheit kullanın
return 0;
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Object Oriented Programming bölümündeki tüm dersler
1Modüler Programlama Temelleri
Başlık DosyalarıInclude Guard'larKaynak DosyalarıStatik FonksiyonlarÖzet: Modüler Hesap Makinesi4Kapsülleme
Opaque Pointer KavramıOpaque Struct TanımlamaGetter ve Setter MetotlarıSetter Metotlarında DoğrulamaÖzet: Gizli Kutu2Nesneler ve Metotlar
Nesne Olarak Struct'lar'Self' İşaretçisiConst Doğruluğuİşaretçi vs DeğerYardımcı MetotlarÖzet: Point Manager5Proje: Basit Banka Hesabı
Proje KurulumuHesabın Oluşturulması3Nesne Yaşam Döngüsü
Constructor DeseniDestructor DeseniStack İlklendirmeDerin KopyalamaÖzet: String Wrapper6Kompozisyon Yoluyla Kalıtım
Struct Gömmeİlk Üye KuralıÜst Üyelere ErişimUpcastingÖzet: Şekil Hiyerarşisi