Özet - Move semantiği
- C++ kursu
- Orta seviye
- Ders 105/116
- 5 dk
std::move ve move ctor'u birleştirerek bir buffer sınıfı yazarsın.
Özet - Move semantiği
Bu grupta move semantiğini öğrendin. T&& rvalue referansı geçici değerlere bağlanır, std::move lvalue'yu rvalue'ya çevirir.
Move constructor T(T&&) yeni nesneye kaynak taşır, move assignment T& operator=(T&&) var olan nesneye taşır. Rule of five beş özel üyenin birlikte tanımlanmasını söyler. Şimdi iki ödevle öğrendiklerini pekiştireceksin: önce rvalue referans fonksiyonu, sonra std::move ile taşıma.
Uygulama rvalue referans fonksiyonu yaz
show adında bir fonksiyon tanımla: parametresi std::string&& s, gövdesi std::cout << s;. main içinde show("Merhaba"); çağır.
Başlangıç kodu
#include <iostream>
#include <string>
// show fonksiyonunu tanımla
int main() {
// show fonksiyonunu çağır
return 0;
}Örnek çözüm
#include <iostream>
#include <string>
void show(std::string&& s) {
std::cout << s;
}
int main() {
show("Merhaba");
return 0;
}Beklenen çıktı
Merhaba
Uygulama std::move ile dizeyi taşı
Başlangıç kodunda a dizesi "Dünya" içeriyor. std::move ile a'nın içeriğini b'ye taşı ve b'yi std::cout ile yazdır.
Başlangıç kodu
#include <iostream>
#include <string>
#include <utility>
int main() {
std::string a = "Dünya";
// a'nın içeriğini b'ye taşı ve b'yi yazdır
return 0;
}Örnek çözüm
#include <iostream>
#include <string>
#include <utility>
int main() {
std::string a = "Dünya";
std::string b = std::move(a);
std::cout << b;
return 0;
}Beklenen çıktı
Dünya
Bölüm sonu
Move semantiğini tamamladın. Artık T&& rvalue referansını kullanabiliyor, std::move ile taşıma yapabiliyorsun.
Move constructor ve move assignment ile kaynakları verimli şekilde aktarıyorsun. Rule of five ve rule of zero ile ne zaman özel üye yazman gerektiğini biliyorsun. Sonraki grupta operatör aşırı yükleme konusunu işleyeceğiz; orada move assignment operatörünü de daha yakından göreceksin.
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 std::move ne yapar?
std::string b = std::move(a);- a'yı siler
- a'yı kopyalar
- a'nın adresini verir
- a'yı rvalue'ya çevirir Doğru cevap
Açıklama: std::move a'yı rvalue'ya çevirir.
2 rvalue referans parametresi
void show(std::string____ s) { std::cout << s; }
void show(std::string&& s) { std::cout << s; }
Açıklama: && rvalue referans işaretidir.