2014-12-26 22 views
12

Aşağıda, farklı türdeki kuruculardan oluşan A sınıfı verilmiştir. Hareket edicisini yorumladığımda, kopya oluşturucuya iki kez çağrılır: bir kez nesneyi, işleve aynı işlevden dönen değer ve diğer işlevlerle geçirmesi için geçirir.Kurucu hem hareket hem de kopya oluşturulduğunda, hangisi çağrılacak?

Kod Parçacığı

sınıf A {

int x; 

public : 
A() { 
    cout<<"Default Constructor\n"; 
} 

A(A&& a) : x(a.x){ 
    cout<<"Move Constructor\n"; 
    a.x=0; 
} 

A(const A& a){ 
    x=a.x; 
    cout<<"Copy Constructor\n"; 
} 

A fun(A a){ 
    return a; 
} 

};

int ana() {

A a; 
A b; 
A c; 
c=a.fun(b); 

}

ÇIKIŞ: hareket yapıcı varsa

Default Constructor 

Default Constructor 

Default Constructor 

Copy Constructor 

Move Constructor 

Bununla birlikte, daha çok kopya kurucu daha adlandırılır. Bunu iyi bir örnekle anlatabilir, böylece bu kavram üzerinde açık olacağım.

Yardımlarınız için minnettarım. Teşekkürler.

+1

Bu kod ('c = a.fun (b)' de kullanılır) atama operatörü silindiği için derleme yapmaz. [Kod için bu işleçleri açıkça derlemek zorundasınız.] (Http://coliru.stacked-crooked.com/a/7194f49acb820000) – 0x499602D2

+0

Benim için derledim. Ödev operatörlerini tanımlamak gerekli mi? – Gayathri

cevap

8

standart return açıklamada ifade otomatik süresi değişkendir durum için özel bir durum verir. Bu durumda, kurucu aşırı yüklenmeleri, return'daki ifadenin bir rvalue olduğu gibi seçilmiştir.

return ifadesindeki ifade, kopyalama elemenine uygun bir otomatik süre değişkeniyse veya bir işlev argümanı olduğu gerçeğini göz ardı ettiyseniz olurdu, daha doğrusu, derleyici, Aşırı yük çözünürlüğü amacıyla bir değer olarak ele alın. C++ 11'de, return ifadesinin ifadesinin, işlev döndürme türü olarak cv-niteliksiz türüne sahip olması gerektiğini unutmayın. Bu, C++ 14'te biraz rahatladı. fonksiyonunda

class A 
{ 
}; 

class B 
{ 
public: 
B(A a) : a(std::move(a)){} 
A a; 
}; 

B f(A a) 
{ 
return a;///When this is implicitly converted to `B` by calling the constructor `B(a)`, the copy constructor will be invoked in C++11. This behaviour has been fixed in C++14. 
} 
+1

Yorum yaptığım satırda mı? Hayır, çünkü a değeri bir değerdir ve istisna burada “a” türü “A”, “f” dönüşü ise “B” olduğunda burada geçerli değildir. Yani, 'a', C++ 11'in kurallarına göre kopya seçim için uygun değil. – Pradhan

+0

O zaman derleyici oluşturulmuş hareket yapıcısı durumunda bile geçerli olmalıdır? – Gayathri

+0

Üzgünüm, ne istediğini anlamıyorum. Daha spesifik olabilir misiniz lütfen? Size atıfta bulunduğunuz çizgiyi ve sizi rahatsız eden davranışları alıntılayın. – Pradhan

4

bir eğlence (A) kopyalama" geçirilen: C++ 11 Örneğin

, aşağıdaki kod yerine hareket yapıcı, A kopya kurucu aramaları "A, temelde geçici bir değişkendir. Hareket ettirici bulunmuyorsa, dönüş değeri bir kopyadır (yani kopya oluşturucu).

bir hareket kurucu sonra derleyici "A" yerine geçici değişkeni daha verimli "hareket" sistematiği gerçekleştirebilirsiniz varsa. Eğer bir kullanıcısının bildirdiği hareket-yapıcı çünkü

+0

Derleyici tarafından oluşturulan taşıma kurucusu neden çağrılsın? – Gayathri

+0

@Gayathri, bir kopya oluşturucuyu tanımlarsanız, derleyici bir hareket oluşturucu oluşturmaz. Eğer ne derleyiciyi tanımlayamazsanız * her ikisini de oluşturabilir * ya da sadece –

+0

@Ryan hareketini yapabilir, ancak ne yapıcı doğru tanımlanmadığında hareket ettiricinin üretilip üretilmediğinden emin olamaz mıyız? Coz, derleyicinin bir kopyasını bulup bulmadığına veya "verimli" olarak hareket edip etmediğine bağlıdır. Bunu doğru mu yaptım? – Gayathri

İlgili konular