const doğruluğu

const, constant (sabit) kelimesinin kısaltmasıdır. Bir değişken const tanımladığında derleyiciye değerinin değiştirilmeyeceği sözü verilir, aksi yöndeki çaba derleme zamanı hatasına neden olur.

Kural:

const tanımlandığı tipin sol tarafına uygulanır, eğer solunda bir tip yoksa sağ tarafına uygulanır.

Const, bir fonksiyonun dönüş tipinde, parametrelerinde ve hatta,üye fonksiyonlar için, tamamında görülebilir.

  • Dönüş tipini const yaparak, dönen değere yanlışlıkla değer atanmasını önleriz.

  • Parametreleri const referans yaparak, kopyama maliyetini azatırız ve o değere salt-okunur (read-only) olarak erişiriz.

  • Üye fonksiyonu const yaparak, o fonksiyonun nesneyi (this pointer) değiştirmeyeceğini garanti ederiz. Bu okuma kolaylığı da sağlar.

#include <iostream>
#include <string>

using std::string;
using std::cout;
class Book {
       private:
	mutable string m_publisher{};
	string m_author{};
	string m_bookName{};
	int m_stock{};
       public:
	Book(const string& t_bookName, const string& t_author)
	    : m_bookName(t_bookName), m_author(t_author) {}

Burada ctor parametrelerini const & olarak alıyor, yani kopyalamadan referans ile ulaşılıyor. const olması bu değerlerin yalnızca atamaların sağında yani rvalue olarak kullanılabileceğini ifade ediyor.

	const string getAuthor() const { return m_author; }

Burada iki tane const görülüyor:

  1. ilki fonksiyonun dönüş tipi olan, bu dönen değere yanlışlıkla değer atamamız engelliyor.
  2. İkincisi biraz daha garip bir yerde, fonksiyon tanımından sonra! Yukarıda listelenen ikinci durumu, yani bu üye fonksiyonun nesnenin hiçbir üyesini modify etmeyeceğini ifade ediyor.
	bool isAvailable() const { return m_stock > 0; }

Burada gene fonksiyon tanımının sonunda bir const var ve fonksiyon açık da olsa okunabilirliği kolaylaştırmak için eklenmiş. Anlamamız gereken, bu üye fonksiyon nesnenin iç yapısını hiçbir şekilde değiştirmiyor.

	void changePublisher(const string& t_publisher) const {
		m_publisher = t_publisher;
	}

Fonksiyon tanımının sonunda bir const var ama bir üye değer değişebiliyor!!! Nedeni m_publisher private üyesinin mutable olarak tanımlanmış olması.

	void changePublisherNewPress(const string& t_publisher) /* const */ {
		m_publisher = t_publisher;
		m_stock += 1000;
	}

Eğer yorumdaki const’u kaldırılsak derleme zamanı hatası alırız, çünkü m_stock değişkeni mutable değil.

};

west const - east const meselesi

west-const ve east-const dili kullanlar arasında const’un tipten önce mi, sonra mı yerleştirilmesi gerektiğini üzerine bir tartışma.

west-const

west-const’u savunanlar okunurluğun daha açık olduğunu, const olduğunun açık bir biçimde belli olması gerektiğini savunuyor.

const double PI = 3.14159;

Okunuş: Kurala göre const’un solunda birşey olmadığında sağına uygulanacak, PI bir const double;

east-const

east-const ise const’un tipten sonra gelmesi gerektiğini, sarmal okuma yaparak neyin const olduğunun daha kolay anlaşılabileceğini savunuyor. Bir diğer itirazları Core Guideline’ın west-const’u savunması. 5 dakikalık aydınlatıcı bir konuşmayı burdan görebilirsiniz.

double const PI = 3.14159;

Okunuş: yukarıdaki kurala göre, const’un solunda double olduğundan, soluna uygulanacak ve PI bir const double

Aynı kurala göre

void (*fn)(int)

fonksiyonunu okursak: fn bir fonksiyona işaret eden bir pointer, int parametre alıyor ve void döndürüyor

Bjarne Stroustup Sık Sorulan Sorular bölümünde isteyenin istediği yere koyabileceğini söylemiş.

Should I put “const” before or after the type?

I put it before, but that’s a matter of taste. “const T” and “T const” were - and are - (both) allowed and equivalent. For example:

	const int a = 1;	// ok
	int const b = 2;	// also ok

My guess is that using the first version will confuse fewer programmers (``is more idiomatic”).


Kaynaklar https://isocpp.org/wiki/faq/const-correctness


C++

497 Words

2018-09-02 03:00 +0300