Menu
Coddy logo textTech

Const Üye Fonksiyonlar

Coddy'nin C++ Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 29 / 104.

Önceki derste getter metotlarında const anahtar sözcüğünü gördün. Peki const bir fonksiyonun parametre listesinden sonra göründüğünde tam olarak ne anlama gelir? const üye fonksiyonu, nesnenin hiçbir üye değişkenini değiştirmeyeceğine söz verir.

class Rectangle {
    int width;
    int height;
public:
    Rectangle(int w, int h) : width(w), height(h) {}
    
    int getArea() const {      // const üye fonksiyonu
        return width * height;  // Üyeleri okumak izinlidir
    }
    
    void setWidth(int w) {     // Non-const - nesneyi değiştirir
        width = w;
    }
};

Parametre listesinden sonraki const, derleyiciye şunu söyler: "Bu işlev nesnenin durumunu değiştirmeyecek." Bir const işlevinin içinde üye değişkeni değiştirmeye çalışırsanız derleyici bir hata üretir.

Bu, const nesnelerle veya const başvurularla çalışırken gerekli hâle gelir. Bir const nesne yalnızca const üye işlevlerini çağırabilir:

void printArea(const Rectangle& rect) {
    std::cout << rect.getArea();    // OK - getArea() const'tır
    // rect.setWidth(10);           // HATA - setWidth() const değil
}

Nesneyi değiştirmeyen işlevleri const olarak işaretlemek iyi bir uygulamadır. Niyetinizi belgelemeyi sağlar, işlevin const nesnelerle çalışmasına olanak tanır ve derleyicinin yanlışlıkla yapılan değişiklikleri yakalamasına yardımcı olur. Yalnızca veri okuyan tüm üye işlevleri const olarak işaretlenmelidir.

challenge icon

Görev

Kolay

Ne zaman ve neden const üye işlevlerinin kullanılacağını gösteren bir sıcaklık dönüştürücü oluşturalım. Bazı yöntemlerin yalnızca verileri okuduğu (ve const olması gerektiği), bazılarının ise nesnenin durumunu değiştirdiği bir sınıf oluşturacaksınız.

Kodunuzu düzenlemek için iki dosya oluşturacaksınız:

  • Temperature.h: Bir sıcaklık değerini depolayan ve bu değeri okumak ve değiştirmek için çeşitli yollar sağlayan bir Temperature sınıfı tanımlayın. Sınıfınız şunlara sahip olmalıdır:
    • Sıcaklığı depolamak için private bir celsius üyesi (double)
    • Başlangıç Celsius değerini alan bir kurucu
    • Depolanan değeri döndüren bir getCelsius() yöntemi. Yalnızca verileri okuduğu için bu yöntem const olmalıdır
    • celsius * 9.0 / 5.0 + 32.0 formülünü kullanarak sıcaklığı Fahrenheit cinsinden hesaplayıp döndüren bir getFahrenheit() yöntemi; herhangi bir şeyi değiştirmediği için bu da const olmalıdır
    • celsius + 273.15 kullanarak sıcaklığı Kelvin cinsinden döndüren bir getKelvin() yöntemi: bu da const olmalıdır
    • Depolanan sıcaklığı güncelleyen bir setCelsius(double value) yöntemi. Nesneyi değiştirdiği için bu yöntem const olamaz
    • Delta değerini mevcut sıcaklığa ekleyen bir adjustBy(double delta) yöntemi; bu da non-const olmalıdır
  • main.cpp: const üye işlevlerinin hem normal hem de const nesnelerle nasıl çalıştığını gösterin. Girdiden başlangıç sıcaklığı değerini okuyun, ardından:
    • Girdi değerini kullanarak bir Temperature nesnesi oluşturun
    • "Initial: <celsius>C = <fahrenheit>F = <kelvin>K" yazdırın
    • Sıcaklığı 10.0 derece artırın
    • "After adjustment: <celsius>C" yazdırın
    • Const referans alan ve "Reading: <celsius>C, <fahrenheit>F" yazdıran void printReadings(const Temperature& temp) yardımcı işlevini oluşturun. Bu işlev, temp üzerinde yalnızca const yöntemleri çağırabilir
    • Sıcaklık nesnenizle printReadings() işlevini çağırın
    • Sıcaklığı 0.0 değerine (donma noktası) ayarlayın
    • "Freezing point: <celsius>C = <fahrenheit>F" yazdırın

Tüm sıcaklık değerlerini <iomanip> içindeki std::fixed ve std::setprecision(1) kullanarak bir ondalık basamakla biçimlendirin.

Buradaki temel fikir, printReadings() işlevinin const bir referans almasıdır; bu nedenle yalnızca const olarak işaretlenmiş yöntemleri çağırabilir. Getter yöntemlerinizi uygun şekilde const olarak işaretlemeniz bu yüzden önemlidir. Bu, nesnenin değiştirilemediği bağlamlarda çalışmalarını sağlar.

Kendin dene

#include <iostream>
#include <iomanip>
#include "Temperature.h"
using namespace std;

// TODO: Temperature sınıfı metotlarını burada uygulayın
// Kurucu
Temperature::Temperature(double initialCelsius) {
    // TODO: celsius'u başlatın
}

// TODO: getCelsius()'u const olarak uygulayın

// TODO: getFahrenheit()'ı const olarak uygulayın

// TODO: getKelvin()'i const olarak uygulayın

// TODO: setCelsius(double value)'yu uygulayın

// TODO: adjustBy(double delta)'yı uygulayın


// TODO: const Temperature& alan bir yardımcı fonksiyon printReadings oluşturun 
// ve "Reading: <celsius>C, <fahrenheit>F" yazdırır
// Note: Bu fonksiyon temp üzerinde yalnızca const metotları çağırabilir!


int main() {
    double initialTemp;
    cin >> initialTemp;

    // Çıktı biçimlendirmesini ayarla
    cout << fixed << setprecision(1);

    // TODO: Giriş değeriyle bir Temperature nesnesi oluştur

    // TODO: "Initial: <celsius>C = <fahrenheit>F = <kelvin>K" yazdır

    // TODO: Sıcaklığı 10.0 derece ayarla

    // TODO: Print "After adjustment: <celsius>C"

    // TODO: Sıcaklık nesnenizle printReadings() çağır

    // TODO: Set the temperature to 0.0 (freezing point)

    // TODO: Print "Freezing point: <celsius>C = <fahrenheit>F"

    return 0;
}
quiz iconKendini test et

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

Kendi başına pratik yap: Online C++ derleyicisi