SORU
17 Ocak 2013, PERŞEMBE


Yıkıcı yapıcı atma sonra aradı

Eğer yapıcı bir istisna, "kısmen inşa edilmiş bu yıkıcı atar bence C kullandım ...

Ama gerçek C 11 artık değil gibi görünüyor: derlenmiş g ve parmak izi ile aşağıdaki kodu "X destructor" konsol. Neden bu?

#include <exception>
#include <iostream>
#include <stdexcept>
using namespace std;

class X
{
public:
    X() : X(10)
    {
        throw runtime_error("Exception thrown in X::X()");    
    }
    X(int a)
    {
        cout << "X::X(" << a << ")" << endl;
    }
    ~X()
    {
        cout << "X destructor" << endl;
    }
};

int main()
{
    try
    {
        X x;
    }
    catch(const exception& e)
    {
        cerr << "*** ERROR: " << e.what() << endl;
    }
}

Çıktı

Standard out:
X::X(10) 
X destructor
Standard error: 
*** ERROR: Exception thrown in X::X()

CEVAP
17 Ocak 2013, PERŞEMBE


Delege constuctors gerçekten yeni bir mantık yıkım getiren yeni bir özelliktir.

Bize yeniden değerlendirelimömür boyubir nesnenin ne zaman başlar, Bir nesnenin ömrübazıkurucu tamamladı. (15,2 ve/2. Standart bu çağrıları "asıl kurucu".) Senin durumunda, bu 5 ** kurucu. İkinci olarak, delege kurucu X() sadece düz bir üye olarak artık işlev görür. Kapsamı üzerine gevşemek, yıkıcılar tam yapılandırılmış nesneler olarak adlandırılır ve bu x içerir.

Etkileri bu aslında oldukça derin: artık koy "karmaşık" iş yükü içine bir kurucu ve almak dolu avantaj her zamanki istisna yayma sürece yaptığınız kurucu temsilci için bir yapıcı. Böyle bir tasarım çeşitli ihtiyaç ""normal bir kurucu çok fazla iş koymak için istenen değildi o zaman. popüler olmak için kullanılan-fonksiyonları başlatma önlemek olabilir

Gördüğünüz davranışları tanımlayan belirli bir dil

[C 11: 15.2/2]:[..]Bir nesne için olmayan delege yapıcı benzer şekilde, yürütme ve bir istisna çıkar, bu nesne için temsilci seçme bir kurucu tamamladı, nesnenin yıkıcı çağrılacak.[..]

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Benjamin Heckendorn

    Benjamin Hec

    4 Mayıs 2008
  • kylediablo

    kylediablo

    8 Ocak 2007
  • Tomas N

    Tomas N

    14 Kasım 2010