Platform
Programlama

5. Sabitler ve const - C++

Değişmeyecek olan sayılar için const / constexpr kullanımı.

resul · Editör, Yazar· 9 Ağustos 2026· 3 dk okuma

Değişkeni nasıl tutacağımızı üçüncü derste görmüştük. Şimdi ise değişmeyecek olan değişkeni nasıl koruyacağımızı öğrenelim. Yani const u değişken türünün başına eklediğimizde kod içinde bu değişkeni değiştirmeye kalktığımızda derleyici hata versin. Mesela const int a{1} için a += 1; yapmamız normalde a yı 1 arttırmak anlamına gelirken const koyduğumuzda hata bekleriz.

cpp
const int maksimum_deneme{3};
const double pi{3.141592653589793};

int deneme{0};
deneme += 1;              // olur
// maksimum_deneme += 1;  // derlenmez, doğru davranış

constexpr

const kilittir: başladıktan sonra nesneye yeni değer yazamazsın. Kilidin kendisi, o değerin derleme anında bilinmesini zorunlu kılmaz. Kullanıcıdan gelen sayı da const olabilir; çalışma anında doldurulur, sonra kilitlenir.

constexpr hem kilittir (const gibi değiştirilemez) hem de başlatıcının bir sabit ifade (constant expression) olmasını ister. Sabit ifade, derleyicinin programı çalıştırmadan hesaplayabileceği ifadedir: yazdığın sayı, const/constexpr tamsayı, sizeof, izinli constexpr işlev çağrısı. std::cin ile dolan bir int sabit ifade değildir.

Sabit ifade isteyen yerler vardır. Dizi boyutu, case etiketi, tamsayı şablon argümanı, static_assert gibi ileride göreceğiniz bazı yerler çalışma anı değeri kabul etmez. const int n{std::cin ile dolan şey}; oraya sığmaz. constexpr int n{4}; sığar. const int n{4}; tamsayıysa çoğu yerde sabit ifade sayılır; kilit ile sabit ifadeyi karıştırma: const her zaman derleme anı demek değildir.

cpp
#include <iostream>

int sayi;
std::cin >> sayi;

const int a{sayi};        // kilit: a'yı sonra değiştiremezsin, değer çalışma anında geldi
const int dort{4};        // kilit + sabit ifade (tamsayı const, sabit ile başladı)
constexpr int b{4};       // kilit + sabit ifade, zorunlu
// constexpr int c{sayi}; // hata: sayi sabit ifade değil

constexpr işlevi, ayrı bir kapıdır. İşlev constexpr ise sabit ifadeyle çağrılırsa derleme anında hesaplanabilir; sıradan değerle çağrılırsa çalışma anında da çalışabilir. “constexpr = her zaman derlemede hesaplanır” diyemeyiz elbette derlemede hesaplanabilir ama her zaman değil. Derleme anında kullanacağın sonuç için hem işlevin constexpr olması hem argümanların sabit ifade olması gerekir. (Tamamen anlama, gerektiği zaman zaten anlayacaksın.) Mesela:

cpp
#include <iostream>

constexpr int iki_kat(int x) { return x * 2; }

constexpr int derlemede{iki_kat(4)}; // 8, derleme anında hesaplanabilir
int sayi;
std::cin >> sayi;
int calismada{iki_kat(sayi)};        // çalışma anında da olur
// constexpr int digersayi{iki_kat(sayi)}; // hata: sayi sabit ifade değil

Burada derlemede adlı değişken, constexpr işlevin sabit ifadeyle çağrılmasıyla derleme anında hesaplanabilir. Ancak program çalışırken std::cin ile girilmiş bir sayi değişkeni normal bir int değişkenini constexpr içeren bir fonksiyondan dönen değerle doldurabilir ancak örnekteki digersayi adlı değişken constexpr olduğu için constexpr bir fonksiyondan dönen bir değeri almaz sabit ifade olmadığı için. Henüz fonksiyonları anlatmadım ancak seriyi takip etmeyen sadece derse bakmış olan biri için yazdım. Seriyi takip ediyorsan kesinlikle anlamış olman beklenmiyor.

Kısaca: değişmesin istiyorsan const. Derleyicinin sayıyı şimdiden bilmesi gereken yerde constexpr (ve sabit ifade kuralları). const kilidi, constexpr hem kilit hem “bu ifade derlemede hesaplanabilir olsun” şartıdır.

Alışkanlık

Yeni sabit değişken yazarken önce const koy. Derleyici “bunu değiştiriyorsun” derse constu kaldırırsın istersen. Ancak eğer sabit ama ben zaten değiştirmeyeceğim deyip const olmadan kullanırsan ileri C++’ta const-correctness kuralını çiğnersin. Çünkü ileride unutup değiştirebilirsin yanlışlıkla yada ekipçe çalışırken sorun yaşayabilirsin.

Kaynaklar

Editör · Yazarresul
cppprogramlama