Const Doğruluğu
Coddy'nin C Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 8 / 61.
Metot olarak işlev gören işlevler yazarken bazıları nesneyi değiştirmelidir (player_take_damage gibi), diğerleri ise hiçbir şeyi değiştirmeden yalnızca verileri okumalıdır. const anahtar sözcüğü, bu ayrımı derleyici düzeyinde zorunlu kılmanızı sağlar.
Bir işaretçi parametresini const olarak işaretleyerek, işlevin işaret ettiği verileri değiştirmeyeceğine söz vermiş olursun. Yanlışlıkla bir üyeyi değiştirmeye çalışırsan derleyici bir hata üretir:
typedef struct {
int x;
int y;
} Point;
// Bu fonksiyon noktayı yalnızca OKUYABİLİR
void point_print(const Point *self) {
printf("(%d, %d)\n", self->x, self->y);
// self->x = 10; // ERROR: const pointer üzerinden değiştirilemez
}
// Bu fonksiyon noktayı DEĞİŞTİREBİLİR
void point_move(Point *self, int dx, int dy) {
self->x += dx;
self->y += dy;
}
const Point *self parametresi, hem derleyiciye hem de diğer programcılara point_print işlevinin bir "getter" veya salt okunur işlem olduğunu belirtir. Buna const doğruluğu adı verilir: değişikliğin gerekli olmadığı her yerde const kullanmak.
Bu uygulama hataları erkenden yakalar. Bir görüntüleme işlevi yazarken yanlışlıkla bir alanı değiştirirseniz derleyici, hatanın programınıza sızmasına izin vermek yerine sizi hemen durdurur.
Görev
KolayBir sıcaklık değerini depolayan ve hem salt okunur hem de değiştirme işlemleri sağlayan bir Temperature modülü oluşturalım. Bu, yalnızca verileri okuyan işlevlerle verileri değiştiren işlevleri açıkça ayırt etmek için const işaretçilerini kullanma pratiği yapmanıza yardımcı olacak.
Üç dosya oluşturacaksınız:
temperature.h: Tek birTemperatureüyesine sahip birdouble celsiusyapısı tanımlayın. Ayrıca üç işlev tanımlayın:temp_display: Temperature'a birconstişaretçisi alır ve mevcut sıcaklığı yazdırır (salt okunur)temp_adjust: Temperature'a normal bir işaretçi ve bir double miktarı alır, ardından miktarı celsius değerine ekler (değiştirir)temp_to_fahrenheit: Temperature'a birconstişaretçisi alır ve Fahrenheit'a dönüştürülmüş değeri döndürür (salt okunur)
TEMPERATURE_Hsembolüyle include guard'ları kullanın.temperature.c: Üç işlevin tamamını uygulayın.temp_displayişleviCurrent: {celsius}Cbiçiminde yazdırmalıdır.temp_to_fahrenheitişlevicelsius * 9.0 / 5.0 + 32.0döndürmelidir.constişaretçileri kullanan işlevlerin yapının verilerini değiştiremeyeceğini unutmayın.main.c: Bir Temperature oluşturun, işlemleri gerçekleştirin ve sonuçları görüntüleyin.
İki girdi alacaksınız: başlangıç Celsius değeri (double olarak) ve ayarlama miktarı (double olarak).
Ana dosyanızda:
- Başlangıç Celsius değeriyle bir
Temperaturebaşlatın - Başlangıç sıcaklığını göstermek için
temp_displayişlevini çağırın - Sıcaklığı ayarlama miktarı kadar değiştirmek için
temp_adjustişlevini çağırın - Güncellenmiş sıcaklığı göstermek için
temp_displayişlevini tekrar çağırın temp_to_fahrenheitkullanarak Fahrenheit dönüşümünü yazdırın
Sonuçları şu biçimde yazdırın:
Current: {celsius}C
Current: {celsius}C
Fahrenheit: {fahrenheit}FTüm sıcaklık değerlerini bir ondalık basamak gösterecek şekilde yazdırmak için %.1f kullanın.
Örneğin, başlangıç değeri 20.0 ve ayarlama değeri 5.0 olduğunda çıktı şöyle olur:
Current: 20.0C
Current: 25.0C
Fahrenheit: 77.0FKendin dene
#include <stdio.h>
#include "temperature.h"
int main() {
double initial_celsius, adjustment;
scanf("%lf", &initial_celsius);
scanf("%lf", &adjustment);
// TODO: Bir Temperature struct oluştur ve initial_celsius ile başlat
// TODO: Başlangıç sıcaklığını göstermek için temp_display'i çağır
// TODO: Sıcaklığı adjustment miktarı kadar değiştirmek için temp_adjust'i çağır
// TODO: Güncellenmiş sıcaklığı göstermek için temp_display'i tekrar çağır
// TODO: temp_to_fahrenheit kullanarak Fahrenheit dönüşümünü yazdır
// Biçim: "Fahrenheit: %.1fF\n"
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