C++ 14
C++ 11 ile birlikte Modern C++ olarak adlandırılan C++ diline C++ 14 ile eklenen yeni özelliklerle ilgili bilgiler örneklerle yer alıyor.
C++ 14 nedir?
C++ 11 ile birlikte C++ Modern C++ olarak adlandırılmakta ve modern programlama dillerinde yer alan bir çok özelliği C++ ile kullanmamıza imkan vermektedir.
C++ 11 ile birlikte C++ artık sürekli olarak güncelllenen bir dil haline geldi.
C++ 14 ise C++ 11 ile birlikte gelen özelliklerin eksiklerin giderildiği ve yeni özelliklerin eklendiği bir C++ sürümüdür.
C++ 14 ile gelen yeni özelliklere bakmadan önce C++ 11 yazıma bakmanızda fayda var.
Nasıl çalıştırılır?
C++ 14 ile gelen özellikler bir çok derleyici tarafından kullanıma hazır hale getirilmiştir.
C++ 14 özelliklerinin kullanmak için derleyici parametresine (flags) -std=c++1y veya -std=c++14 eklemek yeterli olacaktır.
Ayrıca cpp.sh gibi çevrimiçi derleyicilerde kullanılabilir.
1. Binary Literals
C++ ile ikilik tabanda sayıların gösterimi daha kolay hale gelmiştir.
#include<iostream>
using namespace std;
int main(){
int sayi1 = 1453;
int sayi2 = 0x5AD;
int sayi3 = 0b0000010110101101;
cout << sayi1 << endl;
cout << sayi2 << endl;
cout << sayi3 << endl;
return 0;
}
Sistem seviyesindeki işlemler yaparken binary literals kolaylık sağlayacaktır.
2. Digit Separator
Sayıları (int, double, float) tek tırnak işareti (‘) ile parçalara bölmeyi sağlar.
#include<iostream>
using namespace std;
int main(){
int sayi1 = 10000000;
cout << sayi1 << endl;
int sayi2 = 1'000'0000;
cout << sayi2 << endl;
return 0;
}
Bu özellik yazılan uzun sayıların okunurluğunu arttıracaktır.
3. Return type deduction
C++ 11 ile birlikte gelen auto anahtar kelimesinin kullanım alanı genişletildi.
#include<iostream>
using namespace std;
auto kup(int x){
return x * x * x;
}
int main(){
cout << kup(3) << endl;
return 0;
}
C++ 14 ile birlikte auto anahtar kelimesi fonksiyon sonucuna göre tür belirleme için kullanılabilecek.
4. decltype(auto)
C++ 11 ile birlikte gelen decltype anahtar kelimesinin kulllanım alanı genişletildi.
#include<iostream>
using namespace std;
decltype(auto) kup(int x){
return x * x * x;
}
string adi = "Yusuf Sezer";
decltype(auto) fonk1(){ return adi;} // dönüş türü: string
decltype(auto) fonk2(){ return (adi);} // dönüş türü: string &
int main(){
cout << kup(3) << endl;
return 0;
}
C++ ile gelen decltype anahar kelimesinin auto anahar kelimesinden ayıran en önemli özellik referans türünden değerleri de tanımlıyor olabilmesidir.
5. Generalized lambda captures & Generic lambdas
C++ 11 ile birlikte gelen lambda fonksiyonları veya anonim fonksiyonların kullanımı daha da esnek hale getirilmiştir.
#include<iostream>
using namespace std;
int main(){
auto kup = [](auto sayi){ return sayi * sayi * sayi; };
cout << kup(3) << endl;
auto sayi = 0;
auto kare = [sayi = 5](){ return sayi * sayi; };
cout << kare() << endl;
return 0;
}
Lambda fonksiyonlarının esnek hale gelmesi daha etkili fonksiyonların yazılmasını kolaylaştırmıştır.
6. Variable templates
C++ 14 ile birlikte artık sabit ifadeler için şablon hazırlama imkanı getirildi.
#include<iostream>
using namespace std;
template<class T>
constexpr T pi = T(3.1415926535897932385);
template<class T>
constexpr T e = T(2.7182818284590452353);
int main(){
cout << pi<int> << endl;
cout << pi<double> << endl;
cout << e<int> << endl;
cout << e<double> << endl;
return 0;
}
Sabit ifadeler için şablon ifadesinin getirilmesi tür dönüşüm işlemini daha kolay hale getirmiştir.
7. constexpr
C++ 11 ile birlikte gelen constexpr anahtar kelimesinin kullanım alanı daha da genişletildi.
#include<iostream>
using namespace std;
constexpr int factorial(int n) {
if (n <= 1) {
return 1;
} else {
return n * factorial(n - 1);
}
}
int main(){
cout << factorial(5);
return 0;
}
C++ 11 ile gelen constexpr anahtar kelimesi derleme zamanında işlem yaptığından daha hızlı çalışır.
8. deprecated
C++ 14 ile birlikte gelen güzel bir özellik ise kullanımdan kaldırılan sınıf veya fonksiyonları belirtmek için kullanılan [[deprecated]] anahtar kelimesidir.
#include<iostream>
using namespace std;
class [[deprecated]] EskiBirSinif{ };
[[deprecated("Bu fonksiyon artık kullanılmıyor.")]]
void EskiBirFonksiyon(){ printf("Yusuf Sezer"); }
int main(){
EskiBirSinif *pEskiBirSinif = new EskiBirSinif();
delete pEskiBirSinif;
EskiBirFonksiyon();
return 0;
}
Derleyiciye [[deprecated]] ile sınıf veya fonksiyonun kullanımdan kaldırıldığını bildirip uyarı mesajı verebiliriz.
9. Öntanımlı sabitler
C++ 11 ile birlikte gelen kullanıcı tanımlı sabitler özelliği C++ 14 ile birlikte çeşitli sınıflara eklenmiş olarak gelmektedir.
#include<iostream>
#include<chrono>
using namespace std;
//using namespace std::chrono_literals;
int main(){
auto day = 24h;
day.count(); // == 24
chrono::duration_cast<chrono::minutes>(day).count(); // == 1440
return 0;
}
Örnekte görüldüğü üzere C++ 11 ile birlikte gelen ve tarih saat işlemleri için kullanılan chrono sınıfındaki h sabiti kullanılmıştır.
C++ 14 ile birlikte chrono sınıfına benzer şekilde diğer sınıflara da çeşitli özellikler eklenerek dilin daha esnek olması sağlanmıştır.
Hayırlı günler dilerim.