SORU
14 Kasım 2009, CUMARTESİ


Kopya yapıcı ve C = operatör aşırı yükleme : ortak bir işlevi olabilir?

Kopya yapıcı beri

MyClass(const MyClass&);

ve = aşırı operatör

MyClass& operator = (const MyClass&);

bunları kullanmak için de hemen hemen aynı kod, aynı parametre ve dönüş farklı, ortak bir işlev için kullanmak mümkün mü?

CEVAP
14 Kasım 2009, CUMARTESİ


Evet. İki ortak seçenek vardır. Tavsiye etmiyorum - kopyadan operator= açıkça kurucusunu çağırmak için:

MyClass(const MyClass& other)
{
    operator=(other);
}

Ancak, operator= iyi sağlayan eski devlet ve sorunları kendi kendine atama Doğan ile ilgili geldiğinde bir meydan okuma. Ayrıca, tüm üyeleri ve bazlar varsayılan other atanacak hatta ilk başlatıldı. Bu bile tüm üyeleri ve bazlar için geçerli olmayabilir ve geçerli olmasına gönderilmesinin gereksiz olduğunu ve neredeyse pahalı olabilir.

Giderek daha popüler bir çözüm *11 kopya oluşturucu kullanarak ve takas yöntemi uygulamak.

MyClass& operator=(const MyClass& other)
{
    MyClass tmp(other);
    swap(tmp);
    return *this;
}

hatta:

MyClass& operator=(MyClass other)
{
    swap(other);
    return *this;
}

** 14 fonksiyon genellikle basit sadece iç sahipliğini değiştirir gibi yazmaktır ve mevcut durumu temizlemek veya yeni kaynaklar tahsis etmek zorunda değildir.

Kopyalama ve takas deyim avantajları otomatik olarak kendi kendini atama güvenli ve takas işlemi no-at verilmek şartıyla - aynı zamanda güçlü bir özel durum güvenli olmasıdır.

İçin güçlü bir özel kasa, bir 'el' yazılı atama operatörü genellikle vardır ayrılacak bir kopyasını yeni kaynaklar daha önce de-tahsis devralan eski kaynaklar böyle bir durum oluşur ayrılırken, yeni kaynaklar, eski Devlet olabilirler döndü. Tüm bu kopyalama ve takas ile bedavaya geliyor ama genellikle daha karmaşık ve hata eğilimli dolayısıyla, sıfırdan yapmak.

En çok dikkat etmen gereken tek şey takas yöntemi gerçek bir takas, ve kopya yapıcı ve atama operatörünü kendisi kullandığı varsayılan std::swap olduğundan emin olun.

Genellikle bir memberwise swap kullanılır. std::swap çalışır ve 'hayır-at' temel türleri ve işaretçi türleri ile garantili. En akıllı işaretçiler da atış garantisi ile takas olabilir.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • AmazonWireless

    AmazonWirele

    8 EYLÜL 2010
  • Noam Erez

    Noam Erez

    3 NİSAN 2012
  • Ryan Ha

    Ryan Ha

    9 NİSAN 2006