Stack İlklendirme
Coddy'nin C Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 14 / 61.
Her nesnenin yığında yaşaması gerekmez. Bir struct küçük ve kısa ömürlü olduğunda, onu yığında ayırmak daha basit ve hızlıdır: malloc yok, free yok, bellek sızıntısı riski yok.
Bir işlev, bir işaretçi döndürmek yerine yapıyı değer olarak 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, tamamen 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, temizleme gerekmiyor. origin ve cursor kapsam dışına çıktığında otomatik olarak yok edilirler.
Bu yaklaşım, dinamik olarak ayrılmış üyeler içermeyen küçük struct'lar için en iyi şekilde çalışır. Daha büyük nesneler veya heap belleğine işaretçiler içeren nesneler için malloc kullanan kurucu kalıbı daha iyi bir seçenek olmaya devam eder.
Görev
KolayBir fabrika işlevi kullanarak yığın üzerinde sıcaklık okumaları oluşturan bir Temperature modülü oluşturalım. Önceki derslerdeki yığın tabanlı oluşturucuların aksine bu yaklaşım, yapıyı değer olarak döndürür: malloc yok, free yok; yalnızca basit ve verimli yığın tahsisi vardır.
Üç dosya oluşturacaksınız:
temperature.h: İki üyeye sahip birTemperatureyapısı bildirin:double celsiusve Celsius değerini belirtmek üzere'C'saklayanchar scale. Ayrıca iki işlev bildirin:create_temperature: bir double değer alır ve değer olarak (işaretçi olarak değil!) birTemperatureyapısı döndürürtemperature_to_fahrenheit: birconst Temperature *alır ve eşdeğer Fahrenheit sıcaklığını double olarak döndürür
TEMPERATURE_Hsembolüyle include korumaları kullanın.temperature.c: Her iki işlevi de uygulayın. Fabrika işleviniz yerel birTemperaturedeğişkeni oluşturmalı, alanlarını başlatmalı (scaledeğerini'C'olarak ayarlamalı) ve bu değişkeni döndürmelidir. Dönüşüm formülü şöyledir:fahrenheit = celsius * 9.0 / 5.0 + 32.0main.c: Bir sıcaklık okuması oluşturmak ve hem Celsius hem de Fahrenheit değerlerini görüntülemek için fabrika işlevinizi kullanın.
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 bunun Fahrenheit karşılığını yazdırın.
Çıktıyı şu biçimde yazdırın:
Celsius: {celsius}
Fahrenheit: {fahrenheit}Her iki değeri de iki ondalık basamakla görüntülemek için %.2f kullanın.
Örneğin, 25.0 girdisiyle çıktı şöyle olur:
Celsius: 25.00
Fahrenheit: 77.00Bu yaklaşımın ne kadar temiz olduğuna dikkat edin. Bellek yönetimiyle ilgili herhangi bir kaygı olmadan tamamen başlatılmış bir yapı elde edersiniz. Temperature değişkeniniz kapsam dışına çıktığında otomatik olarak temizlenir.
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
// TODO: Celsius değerini %.2f formatını kullanarak yazdır
// TODO: Fahrenheit değerini dönüştürüp yazdırmak için temperature_to_fahrenheit kullan
return 0;
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama 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şisiKendi başına pratik yap: Online C derleyicisi