noexcept
- C++ kursu
- İleri seviye
- Ders 77/83
- 5 dk
noexcept ile exception belirtimini öğrenirsin.
noexcept nedir?
noexcept, bir fonksiyonun istisna fırlatmayacağını belirten bir belirteçtir. Derleyiciye ve okuyana bir güvenlik sözleşmesi verir. İstisna fırlatırsa std::terminate çağrılır.
Örnek: void swap_ints(int& a, int& b) noexcept { int t = a; a = b; b = t; }. Bu fonksiyon basit atamalar yapar, istisna fırlatamaz. noexcept sayesinde derleyici daha iyi kod üretir ve çağıranlar rahatça kullanır. Özellikle yıkıcılar, swap ve taşıma (move) işlemleri noexcept olmalıdır. Bu, taşıma semantiğinde optimim davranış için de kritiktir.
noexcept işlev işaretçisi
noexcept, fonksiyon türünün bir parçasıdır. Bir noexcept fonksiyon işaretçisi, yalnızca noexcept fonksiyonları kabul eder.
Örnek: void (*p)(int) noexcept = &some_func;. Burada some_func da noexcept olmalıdır. Bu, geri çağırma (callback) arayüzlerini güvenli yapar: arayan, geri çağırmanın istisna fırlatmayacağını bilir. Modern C++'ta noexcept belirtmek, hem belge hem sözleşme görevi görür. Standart kütüphane, noexcept bilgisini taşıma işlemlerinde en iyi davranışı seçmek için kullanır.
Uygulama noexcept swap_ints yaz
void swap_ints(int& a, int& b) noexcept fonksiyonunu yaz; gövdesi int t = a; a = b; b = t; olsun. main içinde int x = 3, y = 7; tanımla, swap_ints(x, y) çağır ve std::cout << x << y; ile yazdır.
Başlangıç kodu
#include <iostream>
// swap_ints fonksiyonunu noexcept ile yaz
int main() {
// x ve y tanımla, çağır ve yazdır
return 0;
}Örnek çözüm
#include <iostream>
void swap_ints(int& a, int& b) noexcept {
int t = a;
a = b;
b = t;
}
int main() {
int x = 3, y = 7;
swap_ints(x, y);
std::cout << x << y;
return 0;
}Beklenen çıktı
73
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 noexcept kullanımını eşle
| Kavram | Anlamı |
|---|---|
destructor |
noexcept olmalı |
swap |
nothrow takas |
move constructor |
noexcept taşıma |
std::terminate |
İhlalde çağrılır |
2 noexcept bir fonksiyon istisna fırlatırsa ne olur?
- std::terminate çağrılır Doğru cevap
- İstisna yok sayılır
- Program devam eder
- Derleme hatası verilir
Açıklama: noexcept bir fonksiyon istisna fırlatırsa std::terminate çağrılır ve program sonlanır.
3 noexcept anahtar sözcüğü
void swap_ints(int& a, int& b) ____ { int t = a; a = b; b = t; }
void swap_ints(int& a, int& b) noexcept { int t = a; a = b; b = t; }
Açıklama: noexcept, fonksiyonun istisna fırlatmayacağını söyler.