Merhaba.Struct ve union-ın classtan farkı ve benzerliklerini öğrendim. class her ikisinin gördüyü işi göre biliyorsa neden bu iki keywordden istifade ediyoruz? Hangi durumlarda mutlaka struct ve ya mutlaka union kullanmalıyız? Teşekkürler

soruldu: 05 Şub '13, 05:08

Serxan's gravatar image

Serxan
51691106107
cevap kabul oranı: 46%

değiştirildi: 05 Şub '13, 05:27


OOP de bunların nasıl kullanıldığını ve ortak yönlerini bilirseniz zaten kendiliğinden aralarındaki fark anlaşılır. Aşağıda OOP de her birisinin nerede kullanılacağı yazıyor.

Struct/Union

  1. Genel kullanım
  2. Tanımlama ve söz dizim
  3. Üye değişkenlere erişim
  4. Pointer üye değişkenlere erişim

Class

  1. Üye fonksiyonlar(fonksiyon tanımlayabilme)
  2. Üye erişim tipleri : public, private, protected
  3. Veri gizleme
  4. Sınıf bildirimi ve tanımlaması
  5. Kapsam belirme operatorü
  6. Koşullu önişlemci tanımlamaları (sınıf içerisinde veri kontrolü)
  7. Yapıcı ve yıkıcı metodlar

Birbirleri ile olan ilişkileri

  1. public ve private erişim tiplerinin varsayılan olması
  2. Aynı programlama kuralları

Gelişmiş özellikler

  1. İlkleme listesi
  2. Aşırı yükleme operatörleri
  3. Şablon sınıflar

Scruct ve Union hemen hemen benzerdir.

Struct

struct {
    float savings;
    float checking;
    float mortgage;
    float interest;
    float fees;
} BankStatement;

Union (tarih)

union {
    short month;
    short day;
    int year;
} DATE;

Struct (saat)

typedef struct {
    int hour;
    int min;
    int sec;
    char AmPm;
} TIME;

Struct aynı zamanda içerisinde başka bir struct ve ya union yapısınıda tutabilir.

typedef struct {
    bool deposit;
    bool withdraw;
    float Amount;
    float newBalance;
    DATE date; // union
    TIME time; // struct
} Transaction;

Struct için kaç tane ve hangi tipte veri tutacağının sınırı yoktur. Aynı zamanda içerisindeki üyeler kadar bellekte yer tutar.

Class lar hakkında zaten hemen hemen bütün yazılımcıların bilgisi var, ondan dolayı bu kısmı da size bırakıyorum...

Zannedersem asıl sorduğunuz soruyu kaçırmışım. "Bunları(struct) mutlaka kullanmalıyız" diyebileceğimiz bir özellik neredeyse yok. Çünkü struct/union primitif(ilkel, en basit) tiplerdir. Yani int, float, ... vb gibi. Bu tipler bellekte doğrudan adreslemeyle tutulur. Ama sınıflar için aynı durum söz konusu değildir. Sınıflar için arada bir referans vardır. Bundan dolayıda primitif tipler performans açısından daha iyidir. Ama günümüzde donanım o kadar güçlüdür ki, bu aradaki performans artık önemsizdir. Yani sizin için önemli olan veri yapısıdır. Class lar bütün veri yapıları için ihtiyacınızı karşılayacaktır. Çok küçük veri yapıları için yine de struct kullanabilirsiniz.

permanent link

cevaplandı: 05 Şub '13, 05:55

AliR%C4%B1za%20Ad%C4%B1yah%C5%9Fi's gravatar image

AliRıza Adıyahşi ♦
7.9k146288
cevap kabul oranı: 44%

değiştirildi: 05 Şub '13, 09:46

Yanlış biliyor da olabilirim fakat struct C'den kalan bir özellik. C++ da ise Struct ile Class arasındaki tek fark struct ile tanımladığın değişkene erişim belirteci belirtmezsen public, class da ise private olur. Union ise örneğin integer ve double değerler tanımladın. Bu değerlerin sadece bir tanesini saklayabilirsin. Bit sayısı en uzun olan double olduğu için union un hafızadaki değeri de double kadar olur. integer bir değer atadığında integer dışındaki kalan bitler önemsiz bitlere döner. Yani union ile tanımladığın integer değişkene atama yaparsan double değişkenin de değeri değişir (bozulur). Class/Struct ve Union arasında programlamadaki ihtiyaca göre tercihini yaparsın.

permanent link

cevaplandı: 05 Şub '13, 05:43

omerozkan's gravatar image

omerozkan
87581528
cevap kabul oranı: 9%

değiştirildi: 05 Şub '13, 05:44

union fourBytes {
int i; // == 4 Bytes
float f; // == 4 Bytes
char c[4]; // == 4 Bytes
};

void main()
{
fourBytes view;

view.i = 1056964608;
cout << view.i<<endl; // 1056964608;
cout << view.f<<endl; // 0.5
cout << view.c[3]<<endl; // '?'
}

Merhaba arkadaslar benimde union ile bir sorum olcakti. Program calistirildiginad comment olarak verilen degerleri aliyorum. 0.5 ve ? almamdaki sebep Ömer arkadasimin dedigi gibi mi acaba?

Bit sayısı en uzun olan double olduğu için union un hafızadaki değeri de double kadar olur. integer bir değer atadığında integer dışındaki kalan bitler önemsiz bitlere döner. Yani union ile tanımladığın integer değişkene atama yaparsan double değişkenin de değeri değişir (bozulur).

Peki neden ama 0,5 ve ?. Farkli bilgisayarlardada ayni sonuc cikiyor?

permanent link

cevaplandı: 26 Şub '13, 08:26

beterman's gravatar image

beterman
285131722
cevap kabul oranı: 0%

Evet aynen dediğim gibi. Float'ın yapısı biraz daha farklıdır. Yanlış hatırlamıyorsam IEEE 754 standardı olması lazım. Bununla ilgili araştırma yapabilirsin. http://en.wikipedia.org/wiki/IEEE_floating_point adresinden de inceleyebilirsin. Kısacası Float ve Double değişkenlerin yapısı int ve char değişkene göre daha farklıdır. i için verdiğin değer sanırım float olarak yorumlandığında 0.5 e karşılık geliyor.

(26 Şub '13, 08:35) omerozkan omerozkan's gravatar image

peki char icin gelen ?

(26 Şub '13, 08:36) beterman beterman's gravatar image

Char'lar aslında integer değerlerdir. Ascii tablosunu veya diğer karakter setini kullanır. Örneğin A harfinin 10luk tabanda değeri 65'tir. 0 karakteri ise 48 sayısına karşılık gelir. i için verdiğin değerin(bitlerin) c dizisinin 4. karakteri olarak okunduğunda o değer ?'ne karşılık geliyor yorumunu yapabiliriz.

(26 Şub '13, 08:43) omerozkan omerozkan's gravatar image

aciklaman icin tesekkür ederim

(26 Şub '13, 08:46) beterman beterman's gravatar image

Yani kısaca şöyle örneklendireyim c[3] diye okuduğunda 00111111 değerini görür bu da 16lık tabanda 3F yani 10 luk tabanda 63'tür o değer de '?' karakterini gösterir.

(26 Şub '13, 08:47) omerozkan omerozkan's gravatar image

Rica ederim.

(26 Şub '13, 08:48) omerozkan omerozkan's gravatar image

1056964608 sayisindan 00111111'a nasil geldigimizide aciklarsan bu is biter

(26 Şub '13, 08:52) beterman beterman's gravatar image

Union yapısında her değişken tek yerde tutulur. Yani hafızada aynı yeri işgal ederler. Bundan dolayıda union içerisinde farklı tipler tutulmaz. UNION BELLEK GORUNUMU

(26 Şub '13, 08:54) AliRıza Adıyahşi ♦ AliR%C4%B1za%20Ad%C4%B1yah%C5%9Fi's gravatar image

onu zaten yukarda struct ile union arasindaki fark olarak aciklamistik.benim sordugum int 1056964608 sayisinin 4 bytelik sisteme nasil kaydedildigi?

(26 Şub '13, 08:57) beterman beterman's gravatar image

Nasıl kaydedildiği derken neyi kastediyorsunuz?

(26 Şub '13, 09:01) AliRıza Adıyahşi ♦ AliR%C4%B1za%20Ad%C4%B1yah%C5%9Fi's gravatar image

1056964608 sayısının 16lık karşılığı 3F000000 sayısıdır. ASCII tablosuna göre her karakterin değeri 8bit olduğunu düşünürsek sen c[3] diye okuduğunda demek ki ilk 8 biti okuyor demektir. O da 16lık tabanda 3F sayısı yapar yukarda bahsettiğim gibi 3F de ? karakterine karşılık gelir.

(26 Şub '13, 09:11) omerozkan omerozkan's gravatar image
11 yorumdan 5 tanesi gösteriliyor hepsini göster
Cevabınız
toggle preview

Bu soruyu takip et

E-Posta üzerinden:

Üyelik girişi yaptıktan sonra abonelik işlemlerini yapabilirsiniz

RSS üzerinden:

Cevaplar

Cevaplar ve Yorumlar

Yazı Formatlama

  • *italic* ya da _italic_
  • **bold** ya da __bold__
  • link:[text](http://url.com/ "başlık")
  • resim?![alt text](/path/img.jpg "başlık")
  • liste: 1. Foo 2. Bar
  • temel HTML etiketleri de kullanılabilir

Bu sorunun etiketleri:

×45
×6
×3
×2

Soruldu: 05 Şub '13, 05:08

Görüntüleme: 1,812 kez

Son güncelleme: 26 Şub '13, 09:11

powered by BitNami OSQA