default ve delete

Constructor yapıcıdır, nesnenin ilk değer atamalarını yapar, hafızadan yer alımını gerçekleştirir.

C++‘ta nesnelerin build-in tipler gibi oluşturulması amaçlanır, nesnelere bir diğerine atanabilir(copy contructor, operator=), toplanabilir, çıkarıla, çarpılabilir ama bütün bunların tanımlanması gerek.

Default constructor argümanı olmayan constructor’a denir. CellPhone sınıfı aşağıdaki gibi olsun.

class CellPhone {
       private:
	std::string brand;
	int release_year;

       public:
	CellPhone(){};
	...
};

burada CellPhone() {} fonksiyonu default constructor’dır. Aynı sınıfı

class CellPhone {
       private:
	std::string brand;
	int release_year;

       public:
	CellPhone() = default;
	...
};

şekinde yazabiliriz. Default constructor, biz yazmasak bile derleyici tarafından oluşturulur.

Eğer bu implicit constructor’ın oluşturulmasını istemiyorsak delete anahtar kelimesini kullanırız:

class CellPhone {
	std::string brand;
	int release_year;

       public:
	CellPhone() = delete;

	...		
};

Bu durumda CellPhone sınıfı bir nesne oluşturamaz. Bu, singleton tasarım desenine ihtiyacımız olduğunda faydalı olabilir.

delete kullanarak bir sınıfın kopyalanma veya taşınma özelliklerini kaldırabiliriz.

class CellPhone {
	std::string brand;
	int release_year;

       public:
	CellPhone() = default;
	CellPhone(const CellPhone&) = delete;
	auto& operator+(const CellPhone&) = delete;

	CellPhone(const CellPhone&&) = delete;
	auto& operator+(const CellPhone&&) = delete;
};

Sınıfın yapılma, yok edilme, kopyalanma, taşınma operasyonlarını <type_traits> kütüphanesindeki fonksiyonlarla kontrol edebiliriz:

std::cout << std::boolalpha << std::endl
	  << std::is_default_constructible<CellPhone>::value << std::endl
	  << std::is_copy_constructible<CellPhone>::value << std::endl
	  << std::is_copy_assignable<CellPhone>::value << std::endl
	  << std::is_move_constructible<CellPhone>::value << std::endl
	  << std::is_move_assignable<CellPhone>::value << std::endl
	  << std::is_destructible<CellPhone>::value << std::endl
	  << std::__is_swappable<CellPhone>::value << std::endl; // C++17, clang 7'de derleniyor
true
false
false
false
false
true
false

C++11

217 Words

2018-05-12 03:00 +0300