Aracılığıyla paylaş


Memberwise atama ve başlatma

Varsayılan atama ve başlatmak için "memberwise atama" ve "memberwise başlatma" sırasıyla yöntemlerdir.Tek tek her üye atama gibi diğer bir üye, her defasında bir nesne kopyalama memberwise atama oluşur.Tek tek üyelerin başlatılıyor gibi diğer bir üye, her defasında bir nesne kopyalama memberwise başlatma oluşur.Memberwise atama her üyenin atama işleci çağırır ve ikisi arasındaki en önemli fark ise (operator=), oysa her üyenin kopya kurucu memberwise başlatma çağırır.

Memberwise atama formda bildirilen atama işleci tarafından gerçekleştirilir:

type**&** type :: operator=( [const | volatile] type**&** )

Varsayılan atama işleçleri memberwise atama için oluşturulan aşağıdaki koşullardan biri doğruysa:

  • Üye sınıfı olan const üyeleri.

  • Başvuru üyelerine üye sınıfı vardır.

  • Üye sınıfı veya onun temel sınıfı özel atama işleci olan (operator=).

  • Bir temel sınıf veya üye sınıfı yok atama işleci olan (operator=).

Memberwise başlatma için varsayılan kopya Kurucular özel kopya yapıcı sınıf veya temel sınıflardan biri varsa veya aşağıdaki koşullardan biri doğruysa oluşturulamıyor:

  • Üye sınıfı olan const üyeleri.

  • Başvuru üyelerine üye sınıfı vardır.

  • Özel Kopyala kurucu üye sınıfı veya onun temel sınıfı vardır.

  • Bir temel sınıf veya üye sınıf hiçbir kopya Oluşturucu sahip.

Varsayılan atama operatörleri ve belirli bir sınıfın kopyası Kurucular her zaman bildirildi ancak aşağıdaki koşulların her ikisini de karşılandığı sürece tanımlandıkları değil:

  • Sınıf, bu kopya için kullanıcı tanımlı bir işlev sağlamaz.

  • Program işlevi mevcut olması gerekir.Bir atama veya başlatma memberwise kopyalamayı gerektiren karşılaşılırsa ya da, bu gereksinim var sınıfın adresini operator= işlevi alınır.

Bu iki koşul karşılanmazsa, derleyici kod üretmek için varsayılan atama işleci ve yapıcı işlevleri (Bu tür kod eleme Microsoft C++ Derleyici tarafından gerçekleştirilen bir iyileştirme olarak) kopyalamak için gerekli değildir.Özellikle, kullanıcı tanımlı sınıfı bildirir, operator= türünde bir bağımsız değişken alır, "için başvuru sınıf adı," hiçbir varsayılan atama işleci oluşturulur.Sınıfın bir kopyası kurucu bildirirse, hiçbir varsayılan kopya kurucu oluşturulur.

Bu nedenle, belirli bir sınıf için A, aşağıdaki bildirimleri her zaman var:

//  Implicit declarations of copy constructor
//   and assignment operator.
A::A( const A& );
A& A::operator=( const A& );

Tanımları (önceki ölçütlere göre) yalnızca gerektiğinde sağlanır.Yukarıdaki örnekte gösterilen kopyalama yapıcı işlevleri sınıfının ortak üye işlevleri olarak kabul edilir.

Varsayılan atama işleçleri nesneler belirli bir sınıfın ortak bir temel sınıf türü nesnelere atanmasını sağlar.Aşağıdaki kod göz önünde bulundurun:

Örnek

// spec1_memberwise_assignment_and_initialization.cpp

#include<stdio.h>

class Account
{
protected:
    int _balance;
public:
   int getBalance() 
   {
      return _balance;
   }
};

class Checking : public Account
{
private:
    int _fOverdraftProtect;
public:
    Checking(int balance, int fOverdraftProtect)
    {
        _balance = balance;
        _fOverdraftProtect = fOverdraftProtect;
    }
};

int main()
{
    Account account;
    Checking checking(1000, 1);
    account = checking;
    printf_s("Account balance = %d\n", account.getBalance());
}
  

Açıklama

Yukarıdaki örnekte, seçilen atama işleci olan Account::operator=.Çünkü varsayılan operator= işlev türünde bir bağımsız değişken alır Account& (için başvuru Account), Account , subobject checking kopyalanır account; fOverdraftProtectkopyalanmaz.

Ayrıca bkz.

Başvuru

Sınıf nesneleri kopyalama