SORU
10 Kasım 2009, Salı


Kolon-üye garip ne (" : ") kurucu sözdizimi?

Son zamanlarda aşağıdaki gibi bir örnek gördüm:

#include <iostream>

class Foo {
public:
  int bar;
  Foo(int num): bar(num) {};
};

int main(void) {
  std::cout << Foo(42).bar << std::endl;
  return 0;
}

Bu garip : bar(num) ne anlama geliyor? Bir şekilde üye değişkeni başlatmak gibi görünüyor ama hiç bu sözdizimi daha önce hiç görmemiştim. int bir fonksiyon/yapıcı bir çağrı gibi ama görünüyor? Yapar benim için bir anlamı yok. Belki birisi beni aydınlatabilir. Ve, bu arada, bu gibi herhangi bir diğer ezoterik dil özellikleri, asla sıradan bir C bir kitap bulacaksınız?

CEVAP
15 Aralık 2011, PERŞEMBE


Foo(int num): bar(num)    

Bu bir denir oluşturmakÜye Başlatıcı ListesiC .

Sadece dedi,başlatırüyesi 12* *değer num.


Başlatma ve constructor içinde Atama arasındaki fark nedir?

Üye Başlatma:

Foo(int num): bar(num) {};

Üye Atama:

Foo(int num)
{
   bar = num;
}

Üye kullanarak Üye başlatıcı bir liste Başlatılıyor ve yapıcı vücudun içinde bir değer atamak arasında önemli bir fark vardır.

Sen ne zamanbaşlatılamadıÜye başlatıcı üzerinden alanlar kurucular bir kez çağrılır ve nesne ve tek bir işlemle inşa başlatılır listesi.

Eğer kullanırsanızatamaalanlar ilk varsayılan yapıcılar ile başlatılır ve daha sonra (atama operatörü) gerçek değerler ile yeniden.

Gördüğünüz gibi kullanıcı tanımlı sınıflar için önemli olabilecek ikincisi, oluşturma & atama ek bir yük vardır.

Cost of Member Initialization = Object Construction 
Cost of Member Assignment = Object Construction   Assignment

İkincisi aslında eşdeğerdir:

Foo(int num) : bar() {bar = num;}

Eski sadece denk gelirken:

Foo(int num): bar(num){}

Bir dahili (kod örneği) veya POD sınıf üyeleri için pratik bir yükü yok.


Ne zaman Üye Başlatıcı listesi kullanmak gerekir mi?

(zorunlu değil)Üye Başlatıcı bir listesi kullanın:

  • Sınıf başvuru üye var
  • Sınıfın statik olmayan, sabit bir üye var ya
  • Sınıf üyesi bir varsayılan kurucu yok ya
  • Temel sınıf üyeleri için başlatma ya
  • Yapıcı parametre adı veri üyesi(bu çok şart değil) olarak aynı olduğunda

Bir kod örneği:

class MyClass
{
    public:
        //Reference member, has to be Initialized in Member Initializer List
        int &i;       
        int b;
        //Non static const member, must be Initialized in Member Initializer List
        const int k;  

    //Constructor’s parameter name b is same as class data member 
    //Other way is to use this->b to refer to data member
    MyClass(int a, int b, int c):i(a),b(b),k(c)
    {
         //Without Member Initializer
         //this->b = b;
    }
};

class MyClass2:public MyClass
{
    public:
        int p;
        int q;
        MyClass2(int x,int y,int z,int l,int m):MyClass(x,y,z),p(l),q(m)
        {
        }

};

int main()
{
    int x = 10;
    int y = 20;
    int z = 30;
    MyClass obj(x,y,z);

    int l = 40;
    int m = 50;
    MyClass2 obj2(x,y,z,l,m);

    return 0;
}
  • MyClass2 üye başlatıcı listesi ile başlatılmış olmalı yani varsayılan bir oluşturucuya sahip değil.
  • MyClass temel sınıf varsayılan bir oluşturucuya sahip değil, üye başlatılamadı bir Üye Başlatıcı Listesi kullanmanız gerekir.

Online version of code sample.


Üye Başlatıcı Listeleri kullanırken önemli hususlar:

Sınıf Üyesi değişkenler, sınıf içinde bildirilen sırayla başlatılır.

Onlardeğilhangi Üye İnitalizer Listede belirtilen sırayla başlatıldı.
Kısacası, Üye Listesi başlatma başlatma sırasını belirlemez.

Her zaman sınıf tanımının içinde bildirilen sipariş Olarak Üye başlatma için üyelerin aynı düzeni korumak için iyi bir uygulamadır yukarıda verilmiştir. Bu Derleyiciler eğer iki emir farklı ise uyar olmasıdır ama nispeten yeni bir kullanıcı başlatma sırasını üye Başlatıcı listesi şaşırtmak ve bazı kod bağımlı yazabilirsiniz.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Ash100HD

    Ash100HD

    29 EKİM 2011
  • Jordie Jordan

    Jordie Jorda

    27 Ocak 2008
  • TastyTuts | Creative video tutorials by Gareth David

    TastyTuts |

    6 Temmuz 2011