Menu

C++ Struct'lar: İlişkili Verileri Tek Bir Tipte Toplama

C++ struct'lar açıklandı: ilişkili değişkenleri tek bir tipte nasıl toplarsınız, struct nesnelerini nasıl tanımlar ve başlatırsınız, bir struct'a nasıl üye fonksiyon ve kurucu eklersiniz ve struct'ın class'tan gerçekte ne farkı vardır.

Bu sayfada çalıştırılabilir editörler var - düzenle, çalıştır ve sonucu anında gör.

Verileri Neden Bir Arada Tutmalı

Şimdiye kadar her değişken tek başına durdu: bir yerde bir int, başka bir yerde bir string. Ama gerçek programlar birkaç parçadan oluşan şeylerle uğraşır; bir noktanın bir x'i ve bir y'si vardır, bir öğrencinin bir adı, bir yaşı ve bir GPA'sı vardır. Bunları dağınık, ayrı değişkenler olarak dolaştırmak hataya açıktır; hiçbir şey onları birbirine bağlamaz ve üçüne de ihtiyaç duyan bir fonksiyonun üç parametre alması gerekir.

Bir struct bunu çözer. İlişkili değişkenleri — yani üyelerini — tek bir birimde toplayan yeni bir tip tanımlar. Tanımlandıktan sonra, tüm demeti depolayabileceğiniz, kopyalayabileceğiniz ve fonksiyonlara geçirebileceğiniz tek bir değer gibi ele alırsınız.

Her üyeye nokta operatörüyle erişirsiniz (s.name, s.age). Struct tanımının kapanış } işaretinden sonraki noktalı virgül zorunludur; onu atlamak C++'ta yeni başlayanların en sık yaptığı derleme hatalarından biridir.

Bir Struct'ı Başlatma

Her alanı elle atamak işe yarar ama uzun sürer ve bir üyeyi atlamak kolaydır. Daha temiz seçenek aggregate initialization'dır: değerleri, üyelerin tanımlandığı sırayla süslü parantezler içinde listeleyin.

Boş varsayılana dikkat edin: Point p; (parantezsiz), x ve y'yi çöp değerlerle bırakır, çünkü yerleşik tip üyeleri otomatik olarak sıfırlanmaz. Point p{}; ise onları değerle 0'a başlatır. Süslü parantezleri tercih edin. Varsayılan değerleri doğrudan tanıma da gömebilirsiniz, böylece Point p; bile temiz başlar:

Fonksiyon Parametresi Olarak Struct'lar

Bir struct tek bir değerdir, dolayısıyla bir fonksiyon üç yerine tek bir parametre alabilir. Yalnızca şunu unutmayın: bir struct'ı değere göre geçirmek tüm üyeleri kopyalar. Birkaç int'ten büyük her şey için, kopyayı atlamak adına const referansla geçirin — bunu referanslar sayfasında gördüğünüz kuralın aynısı.

Bir fonksiyondan tüm bir struct döndürmek, birden çok değeri aynı anda geri vermenin deyimsel yoludur; birden çok çıkış referansıyla uğraşmaktan çok daha temizdir.

Üye Fonksiyon ve Kurucu Ekleme

Bir struct yalnızca veriyle sınırlı değildir. Kendi üyeleri üzerinde işlem yapan üye fonksiyonlar ve nesne oluşturulduğu anda onu başlatan bir kurucu barındırabilir. İşte bir struct'ın davranışa sahip küçük bir nesneye benzemeye başladığı yer burasıdır.

Bir üye fonksiyonun içinde üyelere adlarıyla erişilir (width, height); bunlar bu nesnenin kopyasına atıfta bulunur. area() const olarak işaretlemek, derleyiciye fonksiyonun nesneyi yalnızca okuduğunu söyler; bu da onu const Rectangle değerleri üzerinde de çağırmanıza olanak tanır. Kurucular, o : width(w) başlatıcı liste söz dizimi dahil olmak üzere başlı başına bir konudur; kurucular sayfası derinlemesine ele alır.

Struct vs. class: Gerçek Fark

"Struct'lar veri içindir, class'lar nesne içindir" dendiğini duymuş olabilirsiniz. Bu bir gelenektir, dilin bir kuralı değil. C++'ta bir struct ile bir class neredeyse aynı şeydir; tek yerleşik fark varsayılan erişim düzeyidir.

struct S {
    int x;        // varsayılan olarak public
};

class C {
    int x;        // varsayılan olarak private
};

Bir struct'ın üyeleri aksini işaretlemediğiniz sürece public'tir; bir class'ınkiler ise private olarak başlar. Hepsi bu kadar; her ikisinin de kurucuları, üye fonksiyonları, kalıtımı ve diğer her şeyi olabilir. Üyeleri gizlemek için bir struct'a açıkça erişim belirleyicileri bile ekleyebilirsiniz:

Pratik çıkarım: her alanın serbestçe erişilebilmesi gereken şeffaf veri demetleri için struct'ı kullanın (bir Point, bir Color, bir yapılandırma kaydı); iç durumu genel bir arayüzün ardında korumak istediğinizde ise class'a başvurun. Derleyici ikisine de aynı davranır; anahtar sözcük yalnızca niyetinizi belirtir.

Struct'lardan Oluşan Diziler ve Vector'lar

Bir struct sıradan bir tip olduğundan, birçoğunu bir diziye veya bir vector'e koyabilir ve başka herhangi bir değer gibi üzerlerinde döngü kurabilirsiniz.

İç içe süslü parantezlere dikkat edin: her {"Keyboard", 49.99} bir Product'ı aggregate olarak başlatır, dıştaki parantezler ise vector'ü oluşturur. Aralık tabanlı döngüde const Product& kullanmak, her yinelemede her struct'ın kopyalanmasını önler; &'yi kaldırırsanız her öğeyi gereksiz yere çoğaltmış olursunuz.

Sonraki: Enum'lar

Struct'lar, bir tipi bir araya getirilmiş birkaç değerden oluşturmanıza olanak tanır. Bir sonraki bölüm tam tersi yöne gider: bir enum, adlandırılmış küçük bir kümeden tam olarak bir değer tutabilen bir tip tanımlar; Color::Red, Direction::North veya bir durum makinesinin durumu gibi şeyler için mükemmeldir. enum class'ın, şimdi inşa ettiğiniz struct ve class'larla doğal biçimde uyum sağlayan okunabilir ve tip güvenli sabitler nasıl sunduğunu göreceksiniz.

Sıkça Sorulan Sorular

C++'ta struct nedir?

Bir struct, ilişkili birkaç değişkeni (üye denir) tek bir ad altında toplayan, kullanıcı tanımlı bir tiptir. Ayrı ayrı string name, int age ve double gpa değişkenlerini idare etmek yerine, bunları tek bir Student tipinde toplar ve o nesneyi dolaştırırsınız. Bir struct ayrıca üye fonksiyonlar ve kurucular da barındırabilir; modern C++'ta üyeleri varsayılan olarak public olan, tam teşekküllü bir sınıftır.

C++'ta struct ile class arasındaki fark nedir?

Teknik olarak yalnızca varsayılan erişim düzeyi: bir struct'ın üyeleri aksini belirtmediğiniz sürece public, bir class'ın üyeleri ise varsayılan olarak private'dır. Aynı durum kalıtım için de geçerlidir. Geri kalan her şey (kurucular, üye fonksiyonlar, metotlar, kalıtım) tıpatıp aynı çalışır. Geleneksel olarak programcılar sade veri demetleri için struct'a, değişmezleri (invariant) ve gizli içyapısı olan tipler için ise class'a başvurur.

C++'ta bir struct nasıl başlatılır?

En basit yol, üye sırasına göre süslü parantezlerle yapılan aggregate initialization'dır: Point p{3, 4};. Ayrıca her alanı nokta operatörüyle elle atayabilir (p.x = 3;), tanımda üyelere varsayılan değerler verebilir (int x = 0;) veya struct'ın kendini hazırlaması için bir kurucu yazabilirsiniz. Süslü parantezle başlatma tercih edilir, çünkü alanları sessizce başlatılmamış bırakmaz.

Coddy programming languages illustration

Coddy ile kodlamayı öğren

BAŞLA