2016-03-24 12 views
-8

Bu soruyu okuduğum kitapta, cevap 8 kez idi.Aşağıdaki kopya katmanı kaç kez çağrılır?

  • Nasıl?
  • Lütfen açıklayınız. :)

Temp fun1(Temp x) 
{ 
Temp y(x); 
Temp z=y; 
return z; 
} 
void main() 
{ 
Temp a; 
Temp b=fun1(a); 
Temp c=fun1(b); 
} 
+0

Kitap açıklanmadı mı? (Burada kitabın yanlış olduğuna dikkat etmek gerekir.) –

+1

Muhtemelen RVO'dan (Dönüş Değeri Optimizasyonu) bahsedilmiyor https://en.wikipedia.org/wiki/Return_value_optimization – user3282085

+1

Ayrıca kitap, ana işlevi döndürmeyi öneriyorsa void’de hatalar var. – user3282085

cevap

1
#include <iostream> 
class Temp 
{ 
public: 
    int a; 
    Temp() : a(0) {} 
    Temp(const Temp &ref) : a(ref.a) 
    { 
     std::cout << "Temp(Temp&)" << std::endl; 
    } 
}; 

Temp fun1(Temp x) 
{ 
Temp y(x); 
Temp z=y; 
return z; 
} 
int main(int ac, char**av) 
{ 
Temp a; 
Temp b=fun1(a); 
Temp c=fun1(b); 
} 

clang 6 çağrıları gösterir.

786_ g++ -std=c++11 test.cpp 
787_ ./a.out 
Temp(Temp&) 
Temp(Temp&) 
Temp(Temp&) 
Temp(Temp&) 
Temp(Temp&) 
Temp(Temp&) 
+0

Teşekkürler, kitapta, herhangi bir açıklama yapmadan cevap verdiler. –

İlgili konular