Yapılandırılmış Bağlamalar
Coddy'nin C++ Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 88 / 104.
C++17 ile tanıtılan yapılandırılmış bağlamalar (structured bindings), diziler, çiftler (pairs), demetler (tuples) veya yapılardan (structs) birden fazla değeri tek bir bildirimde ayrı ayrı adlandırılmış değişkenlere açmanıza olanak tanır. Bu, bileşik verilerle çalışırken kodun daha temiz ve okunabilir olmasını sağlar.
Söz dizimi, yeni değişken adlarını içeren köşeli parantezlerle birlikte auto kullanır:
#include <iostream>
#include <map>
#include <tuple>
int main() {
// Bir pair'i ayrıştırma
std::pair<std::string, int> person{"Alice", 25};
auto [name, age] = person;
std::cout << name << " is " << age << "\n";
// Bir tuple'ı ayrıştırma
std::tuple<int, double, char> data{42, 3.14, 'X'};
auto [num, pi, letter] = data;
// Aralık tabanlı for döngülerinde ayrıştırma
std::map<std::string, int> scores{{"Bob", 90}, {"Carol", 85}};
for (const auto& [student, score] : scores) {
std::cout << student << ": " << score << "\n";
}
}Structured bindings ayrıca dizilerle ve genel (public) üyelere sahip özel yapılarla da çalışır:
struct Point {
double x;
double y;
};
Point getOrigin() { return {0.0, 0.0}; }
int main() {
auto [x, y] = getOrigin();
int arr[3] = {1, 2, 3};
auto [a, b, c] = arr;
}Kopyalamayı önlemek ve gerektiğinde orijinal değerlerin değiştirilmesine izin vererek referans ile bağlamak için auto& veya const auto& kullanabilirsiniz. Bu özellik, özellikle STL konteynerleri üzerinde döngü kurarken veya birden fazla değer döndüren fonksiyonları işlerken kullanışlıdır.
Görev
KolayYapılandırılmış bağlamaların (structured bindings) gücünü gösteren bir öğrenci not analizörü oluşturalım. Kodunuz boyunca çiftleri (pairs), demetleri (tuples) ve yapıları (structs) zarif bir şekilde açmak için yapılandırılmış bağlamaları kullanarak öğrenci kayıtlarını ve kurs verilerini işleyen bir sistem oluşturacaksınız.
Kodunuzu üç dosya halinde düzenleyeceksiniz:
Student.h: Öğrencinin adı (std::string), kimliği (int) ve GNO'su (double) için genel üyelere sahip birStudentyapısı (struct) tanımlayın. Ayrıca bir ad, kimlik ve GNO alan ve birStudentyapısı döndürencreateStudentadlı bir fonksiyon oluşturun.GradeUtils.h: Not işleme için yardımcı fonksiyonlar oluşturun.Sayısal bir puan (tam sayı) alan ve üç değer içeren bir
std::tupledöndüren birgetGradeInfofonksiyonu tanımlayın: harf notu (std::string), başarı puanı (double) ve geçip geçmediği (bool). Bu not ölçeğini kullanın:- 90+ : "A", 4.0, true
- 80-89: "B", 3.0, true
- 70-79: "C", 2.0, true
- 60-69: "D", 1.0, true
- 60'ın altı: "F", 0.0, false
Ayrıca bir kurs adı (
std::string) ve puan (int) alan ve bu değerlerin birstd::pairyapısını döndüren birmakeScorePairfonksiyonu tanımlayın.main.cpp: Dört girdi okuyun:- Öğrenci adı (string)
- Öğrenci kimliği (integer)
- Kurs adı (string)
- Puan (integer)
Ana fonksiyonunuz boyunca yapılandırılmış bağlamaları kullanın:
- Ad, kimlik ve 0.0 değerinde bir yer tutucu GNO ile
createStudentfonksiyonunu çağırın. Döndürülen yapıyı ayrı değişkenlere açmak için yapılandırılmış bağlamaları kullanın, ardından şunu yazdırın:Student: [name] (ID: [id]) - Kurs adı ve puan ile
makeScorePairfonksiyonunu çağırın. Çifti açmak için yapılandırılmış bağlamaları kullanın, ardından şunu yazdırın:Course: [course], Score: [score] - Puan ile
getGradeInfofonksiyonunu çağırın. Üç demet öğesinin tamamını açmak için yapılandırılmış bağlamaları kullanın, ardından şunu yazdırın:(Eğer passing true ise "yes", false ise "no" yazdırın)Grade: [letter] Points: [points] Passing: [yes/no]
Örneğin, Alice, 1001, Math ve 85 girdileriyle:
Student: Alice (ID: 1001)
Course: Math, Score: 85
Grade: B
Points: 3
Passing: yesBob, 2002, Physics ve 55 girdileriyle:
Student: Bob (ID: 2002)
Course: Physics, Score: 55
Grade: F
Points: 0
Passing: noGerektiğinde <tuple> ve <utility> kütüphanelerini dahil etmeyi unutmayın. Buradaki temel nokta, yapılandırılmış bağlamaların bileşik türleri (çiftler, demetler ve yapılar) tek bir okunabilir bildirimde adlandırılmış değişkenlere nasıl açmanıza olanak tanıdığıdır.
Kopya kağıdı
Yapılandırılmış bağlamalar (C++17), dizilerden, çiftlerden (pairs), demetlerden (tuples) veya yapılardan (structs) birden fazla değerin tek bir bildirimde ayrı ayrı adlandırılmış değişkenlere açılmasını sağlar.
Temel sözdizimi, köşeli parantezlerle birlikte auto kullanır:
auto [var1, var2, ...] = composite_object;Bir std::pair yapısını açma:
std::pair<std::string, int> person{"Alice", 25};
auto [name, age] = person;Bir std::tuple yapısını açma:
std::tuple<int, double, char> data{42, 3.14, 'X'};
auto [num, pi, letter] = data;std::map gibi kapsayıcılarla aralık tabanlı for döngülerinde yapılandırılmış bağlamaların kullanımı:
std::map<std::string, int> scores{{"Bob", 90}, {"Carol", 85}};
for (const auto& [student, score] : scores) {
std::cout << student << ": " << score << "\n";
}Genel (public) üyelere sahip yapıları (structs) açma:
struct Point {
double x;
double y;
};
Point getOrigin() { return {0.0, 0.0}; }
auto [x, y] = getOrigin();Dizileri açma:
int arr[3] = {1, 2, 3};
auto [a, b, c] = arr;Kopyalamayı önlemek ve orijinal değerlerin değiştirilmesine izin vermek için referansla bağlama yapmak üzere auto& veya const auto& kullanın:
auto& [x, y] = point; // Orijinali değiştirebilir
const auto& [name, age] = person; // Salt okunur referansKendin dene
#include <iostream>
#include <string>
#include "Student.h"
#include "GradeUtils.h"
int main() {
// Girdileri oku
std::string studentName;
int studentId;
std::string courseName;
int score;
std::cin >> studentName;
std::cin >> studentId;
std::cin >> courseName;
std::cin >> score;
// TODO: createStudent fonksiyonunu name, id ve 0.0 olan yer tutucu bir GPA ile çağır
// Struct yapısını açmak için structured bindings kullanın: auto [name, id, gpa] = ...
// Yazdır: Student: [name] (ID: [id])
// TODO: makeScorePair fonksiyonunu course name ve score ile çağır
// Pair yapısını açmak için structured bindings kullanın: auto [course, sc] = ...
// Yazdır: Course: [course], Score: [score]
// TODO: getGradeInfo fonksiyonunu score ile çağır
// Tuple yapısını açmak için structured bindings kullanın: auto [letter, points, passing] = ...
// Yazdır:
// Grade: [letter]
// Points: [points]
// Passing: [yes/no] (eğer passing true ise "yes", false ise "no" yazdır)
return 0;
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1OOP Temelleri
Harici DosyalarC++ Build ve DerlemeBaşlık Dosyaları ve Kaynak DosyalarıAd Alanları ve KapsamC++'ta OOP'ye GirişSınıflar ve Nesneler'this' İşaretçisiMetotlar (Üye Fonksiyonlar)Öznitelikler (Veri Üyeleri)Ctor ve Dtor TemelleriÖzet - Basit Hesap Makinesi4Sınıf Özellikleri
Örnek ve Statik ÜyelerGetter ve Setter MetotlarıConst Üye FonksiyonlarMutable Anahtar KelimesiStatik Metotlar ve DeğişkenlerFriend Fonksiyonlar ve SınıflarÖzet - Banka Hesabı Yöneticisi7Kalıtım
Temel KalıtımKalıtım Erişim SeviyeleriCtor ve Dtor Çağrılma SırasıMetot Geçersiz KılmaSanal Fonksiyonlar ve VTableÇoklu KalıtımSanal KalıtımÖzet - Çalışan Hiyerarşisi10STL Genel Bakış
STL Genel Bakış ve FelsefesiSTL KonteynerleriİteratörlerSTL AlgoritmalarıFunctor'lar ve Lambda İfadeleriÖzet - Kelime Frekansı13Tasarım Kalıpları 1. Bölüm
Tasarım Kalıplarına GirişSingleton KalıbıFactory ve Abstract FactoryBuilder KalıbıObserver KalıbıStrategy Kalıbı2Bellek Yönetimi
Stack ve Heap Bellekİşaretçiler ve ReferanslarDinamik Bellek (new/delete)C++'ta Akıllı İşaretçilerC++'ta RAIIÖzet - Dinamik Dizi Yöneticisi5Kapsülleme
C++'da Erişim BelirleyicilerDerinlemesine Erişim BelirleyicilerBilgi GizlemeStruct vs Classİç İçe ve Dahili SınıflarÖzet - Öğrenci Kayıt Sistemi8Çok Biçimlilik
Derleme ve Çalışma Zamanı Çok BiçimliliğiFonksiyon Aşırı YüklemeSanal Fonksiyonlara Yeniden BakışSaf Sanal FonksiyonlarSoyut SınıflarC++'ta Arayüz TasarımıDynamic Casting ve RTTIÖzet - Şekil Hesaplayıcı3Yapıcılar ve Yıkıcılar
Varsayılan YapıcıParametreli YapıcıKopya YapıcıTaşıma YapıcısıYapıcı İlklendirme ListeleriTemsilci YapıcılarYıkıcılara Derinlemesine BakışÜç / Beş / Sıfır KuralıÖzet - String Sınıfı6Operatör Aşırı Yükleme
Operatör Aşırı Yüklemeye GirişAritmetik Operatör Aşırı YüklemeKarşılaştırma Operatörü Aşırı YüklemeStream OperatörleriAtama Operatörü Aşırı Yükleme[] ve () Operatör Aşırı YüklemeTip Dönüşüm OperatörleriÖzet - Matris Sınıfı9Şablonlar
Fonksiyon ŞablonlarıSınıf ŞablonlarıŞablon ÖzelleştirmeVariadic ŞablonlarSFINAE ve Type Traits TemelleriÖzet - Generic Konteyner12Modern C++ Özellikleri
Taşıma Semantiği ve R-değerleriMükemmel YönlendirmeDerinlemesine Lambda İfadeleristd::function ve std::bindconstexpr ve constevalYapılandırılmış Bağlamalaroptional, variant, any