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.
Görev
KolayNe 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 birTemperaturesı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.0formülünü kullanarak sıcaklığı Fahrenheit cinsinden hesaplayıp döndüren birgetFahrenheit()yöntemi; herhangi bir şeyi değiştirmediği için bu da const olmalıdırcelsius + 273.15kullanarak sıcaklığı Kelvin cinsinden döndüren birgetKelvin()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
- Sıcaklığı depolamak için private bir
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
Temperaturenesnesi oluşturun "Initial: <celsius>C = <fahrenheit>F = <kelvin>K"yazdırın- Sıcaklığı
10.0derece artırın "After adjustment: <celsius>C"yazdırın- Const referans alan ve
"Reading: <celsius>C, <fahrenheit>F"yazdıranvoid 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.0değerine (donma noktası) ayarlayın "Freezing point: <celsius>C = <fahrenheit>F"yazdırın
- Girdi değerini kullanarak bir
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;
}
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
1OOP Temelleri
Harici DosyalarC++ Build ve DerlemeBaşlık Dosyaları ve Kaynak DosyalarıAd Alanları ve KapsamC++'ta OOP'ye GirişSınıflar ve Nesneler'this' İşaretçisiMetotlar (Üye Fonksiyonlar)Öznitelikler (Veri Üyeleri)Ctor ve Dtor TemelleriÖzet - Basit Hesap Makinesi4Sınıf Özellikleri
Örnek ve Statik ÜyelerGetter ve Setter MetotlarıConst Üye FonksiyonlarMutable Anahtar KelimesiStatik Metotlar ve DeğişkenlerFriend Fonksiyonlar ve SınıflarÖzet - Banka Hesabı Yöneticisi7Kalıtım
Temel KalıtımKalıtım Erişim SeviyeleriCtor ve Dtor Çağrılma SırasıMetot Geçersiz KılmaSanal Fonksiyonlar ve VTableÇoklu KalıtımSanal KalıtımÖzet - Çalışan Hiyerarşisi10STL Genel Bakış
STL Genel Bakış ve FelsefesiSTL KonteynerleriİteratörlerSTL AlgoritmalarıFunctor'lar ve Lambda İfadeleriÖzet - Kelime Frekansı13Tasarım Kalıpları 1. Bölüm
Tasarım Kalıplarına GirişSingleton KalıbıFactory ve Abstract FactoryBuilder KalıbıObserver KalıbıStrategy Kalıbı2Bellek Yönetimi
Stack ve Heap Bellekİşaretçiler ve ReferanslarDinamik Bellek (new/delete)C++'ta Akıllı İşaretçilerC++'ta RAIIÖzet - Dinamik Dizi Yöneticisi5Kapsülleme
C++'da Erişim BelirleyicilerDerinlemesine Erişim BelirleyicilerBilgi GizlemeStruct vs Classİç İçe ve Dahili SınıflarÖzet - Öğrenci Kayıt Sistemi8Çok Biçimlilik
Derleme ve Çalışma Zamanı Çok BiçimliliğiFonksiyon Aşırı YüklemeSanal Fonksiyonlara Yeniden BakışSaf Sanal FonksiyonlarSoyut SınıflarC++'ta Arayüz TasarımıDynamic Casting ve RTTIÖzet - Şekil Hesaplayıcı3Yapıcılar ve Yıkıcılar
Varsayılan YapıcıParametreli YapıcıKopya YapıcıTaşıma YapıcısıYapıcı İlklendirme ListeleriTemsilci YapıcılarYıkıcılara Derinlemesine BakışÜç / Beş / Sıfır KuralıÖzet - String Sınıfı6Operatör Aşırı Yükleme
Operatör Aşırı Yüklemeye GirişAritmetik Operatör Aşırı YüklemeKarşılaştırma Operatörü Aşırı YüklemeStream OperatörleriAtama Operatörü Aşırı Yükleme[] ve () Operatör Aşırı YüklemeTip Dönüşüm OperatörleriÖzet - Matris Sınıfı9Şablonlar
Fonksiyon ŞablonlarıSınıf ŞablonlarıŞablon ÖzelleştirmeVariadic ŞablonlarSFINAE ve Type Traits TemelleriÖzet - Generic KonteynerKendi başına pratik yap: Online C++ derleyicisi