Varsayılan kurucu - Default constructor

Bilgisayar olarak programlama dilleri terimi varsayılan yapıcı bir başvurabilirsiniz yapıcı otomatik (örneğin Java) Herhangi programcı tarafından tanımlanan kurucular yokluğunda derleyici tarafından üretilen ve genellikle bir mesafesindedir nullary yapıcı . Diğer dillerde (örneğin C ++ 'da), kurucunun otomatik olarak oluşturulmuş veya kullanıcı tanımlı olmasına bakılmaksızın herhangi bir argüman sağlamaya gerek kalmadan çağrılabilen bir kurucudur. Yapıcı tanımında varsayılan bağımsız değişkenler sağlanmışsa, biçimsel parametrelere sahip bir yapıcının yine de bağımsız değişkenler olmadan çağrılabileceğini unutmayın .

C ++

In C ++ , standart bir şekilde bir sınıf için varsayılan kurucu açıklanır yapıcı argüman olmadan çağrılabilir (bu kimin parametreleri Tüm varsayılan argümanlar var bir yapıcı içerir). Örneğin:

class MyClass
{
public:
    MyClass();  // constructor declared

private:
    int x;
};

MyClass::MyClass() : x(100)  // constructor defined
{
}

int main()
{
    MyClass m;  // at runtime, object m is created, and the default constructor is called
}

Belleği dinamik olarak ayırırken, yapıcı, sınıf adından sonra parantez eklenerek çağrılabilir. Bir bakıma bu, kurucuya yapılan açık bir çağrıdır:

int main()
{
    MyClass * pointer = new MyClass();  // at runtime, an object is created, and the
                                        // default constructor is called
}

Yapıcının bir veya daha fazla parametresi varsa, ancak hepsinin varsayılan değerleri varsa, o zaman yine de varsayılan bir kurucudur. Her sınıfın, biri parametresiz veya tüm parametreleri varsayılan değerlere sahip olan en fazla bir varsayılan kurucuya sahip olabileceğini unutmayın, örneğin bu durumda:

class MyClass
{
public:
    MyClass (int i = 0, std::string s = "");  // constructor declared

private:
    int x;
    int y;
    std::string z;
};

MyClass::MyClass(int i, std::string s)     // constructor defined
{
    x = 100;
    y = i;
    z = s;
}

C ++ 'da, varsayılan oluşturucular önemlidir, çünkü bunlar belirli durumlarda otomatik olarak çağrılır; ve bu nedenle, bu durumlarda, bir sınıfın varsayılan kurucusuna sahip olmaması bir hatadır:

  • Bir nesne değeri bağımsız değişken listesi olmadan bildirildiğinde (örneğin MyClass x; :) veya bağımsız değişken listesi olmadan dinamik olarak tahsis edildiğinde (örneğin: new MyClass; veya new MyClass(); ), MyClass nesneyi başlatmak için varsayılan yapıcısı kullanılır.
  • Bir dizi nesne bildirildiğinde, örneğin MyClass x[10]; ; veya dinamik olarak tahsis edilmiş, örn new MyClass [10] . Varsayılan yapıcısı, MyClass tüm öğeleri başlatmak için kullanılır.
  • Türetilmiş bir sınıf oluşturucu, başlatıcı listesinde temel sınıf yapıcısını açıkça çağırmadığında, temel sınıf için varsayılan kurucu çağrılır.
  • Bir sınıf oluşturucu, başlatıcı listesindeki nesne değerli alanlarından birinin yapıcısını açıkça çağırmadığında, alanın sınıfı için varsayılan kurucu çağrılır.
  • Standart kitaplıkta, belirli kaplar, değer açıkça belirtilmediğinde varsayılan kurucuyu kullanarak değerleri "doldurur". Örneğin vector<MyClass>(10); , vektörü varsayılan olarak oluşturulmuş bir MyClass nesneyle doldurulmuş on öğeyle başlatır .

Bir sınıfın açıkça tanımlanmış yapıcısı yoksa, derleyici dolaylı olarak onun için varsayılan bir kurucu bildirir ve tanımlar. Bu örtük olarak tanımlanmış varsayılan kurucu, boş bir gövdeye sahip açıkça tanımlanmış bir kurucuya eşdeğerdir. Örneğin:

class MyClass
{
    int x;  // no constructor, so the compiler produces an (implicit) default constructor
};

int main()
{
    MyClass m;   // no error at runtime: the (implicit) default constructor is called
}

Oluşturucular bir sınıf için açıkça tanımlanmışsa, ancak bunların tümü varsayılan değilse, derleyici örtük olarak varsayılan bir kurucu tanımlamaz ve bu da sınıfın varsayılan bir kurucuya sahip olmadığı bir duruma yol açar. Aşağıdaki örnekte gösterilen tipik bir hatanın nedeni budur.

class MyClass
{
public:
    MyClass (int y);  // declaration a non-default constructor

private:
    int x;
};

MyClass::MyClass (int y)
{
    x = y;
}

int main()
{
    MyClass m(100);     // the non-default constructor is called
    MyClass * p;        // for pointer declarations, the compiler does not need to know about constructors
    p = new MyClass();  // error at compilation: no default constructor
    return 0;
}

Ne programcı ne de derleyici varsayılan bir kurucu tanımlamadığından, tarafından işaret edilen p nesnenin oluşturulması bir hataya yol açar.

Öte yandan, C ++ 11'de varsayılan bir kurucu açıkça oluşturulabilir:

class MyClass
{
public:
    MyClass () = default;  // force generation of a default constructor
};

Veya açıkça engellenmiştir:

class MyClass
{
public:
    MyClass () = delete;  // prevent generation of default constructor
};

Java ve C #

İkisinde de Java ve C # , "varsayılan kurucu" anlamına gelir nullary yapıcı hiçbir kurucular sınıf için tanımlanmış otomatik derleyici tarafından oluşturulur. Varsayılan yapıcı, üst sınıfın boş yapıcısını örtük olarak çağırır, ardından boş bir gövdeyi çalıştırır. Tüm alanlar 0 (tam sayı türleri), 0,0 (kayan nokta türleri), false ( boolean tür) veya null (başvuru türleri) başlangıç ​​değerlerinde bırakılır . Hiçbir parametre almayan programcı tanımlı bir kurucu, C # ' da varsayılan kurucu olarak da adlandırılır , ancak Java'da değildir .

Referanslar

  1. ^ C ++ standardı, ISO / IEC 14882: 1998, 12.1.5
    C ++ standardı, ISO / IEC 14882: 2003, 12.1.5
  2. ^ Bilgisayar Bilimleri Behrouz A. Forouzan ve Richard F.Gilberg tarafından C ++ Kullanan Yapılandırılmış Bir Yaklaşım
  3. ^ Bilgisayar Bilimleri Behrouz A. Forouzan ve Richard F.Gilberg tarafından C ++ Kullanan Yapılandırılmış Bir Yaklaşım
  4. ^ Java Language Specification, 3rd edition, section 8.8.9 , "Default Constructor".
  5. ^ Oluşturucuları Kullanma (C # Programlama Kılavuzu)