2011-03-14 3 views
0
class A1{ 
public: 
    A1(){} 
    A1(const A1& rhs){} 
    void foo() {std::cout<<"Hello";} 
}; 

class A2: public A1{ 
public: 
    A2(){} 
    A2(const A2& rhs){} 
    void foo1(A1&rhs){rhs.foo();} 
    void foo2(A1 a1){a1.foo();} 
}; 

int main() 
{ 
    A2 a2; 
    A1 a1(a2); 

    a2.foo1(a1); 
    a2.foo2(a1); 
} 

A1의 복사 생성자가 몇 번 호출 되었습니까? A2의 복사 생성자가 몇 번 호출 되었습니까?C++의 복사 생성자

아무도 내게 이것을 가르쳐 줄 수 있습니까? 감사!

+6

을 , 여러분은 A1의 ctor "<< endl;"에'cout << "과 같은 것을 넣을 수 있고 생성자에서 코드를 실행하여 직접 볼 수 있습니다. –

+0

@ Martinho - 만약 당신이 더 게으른 사람이라면, 당신은'static int i = 0; std :: cout << ++ i << "A1에서 시간"<< std :: endl; –

답변

2

어디서나 변수 이름을 다시 사용하지 않는 코드에 대해 이야기하는 것이 훨씬 쉽습니다.

A1의 복사 생성자가 두 번 호출되고 A2은 전혀 복사되지 않습니다.

class A1{ 
public: 
    A1(){} 
    A1(const A1& rhs){} 
    void foo() {std::cout<<"Hello";} 
}; 

class A2: public A1{ 
public: 
    A2(){} 
    A2(const A2& rhs){} 
    void foo1(A1& a1byref){a1byref.foo();} 
    void foo2(A1 a1byval){a1byval.foo();} 
}; 

int main() 
{ 
    A2 a2; 
    A1 a1(a2); // calls A1 copy constructor 

    a2.foo1(a1); 
    a2.foo2(a1); // calls A1 copy constructor 
} 
1

더 명시 적으로 출력을 위해 약간의 코드를 수정, 내가 가진 : 엑스 코드를 3.2.5 수익률 사용

#include <iostream> 

class A1{ 
public: 
    A1(){} 
    A1(const A1& rhs) 
     { std::cout << "A1::copy_ctor\n"; } 
    void foo() 
     { std::cout << "A1::foo\n"; } 
}; 

class A2: public A1{ 
public: 
    A2(){} 
    A2(const A2& rhs){} 
    void foo1(A1&rhs) 
     { 
     std::cout << "A2::foo1\n"; 
     rhs.foo(); 
     } 
    void foo2(A1 a1) 
     { 
     std::cout << "A2::foo2\n"; 
     a1.foo(); 
     } 
}; 

int main() 
{ 
    A2 a2; 
    A1 a1(a2); 

    a2.foo1(a1); 
    a2.foo2(a1); 
} 

: "얼마나 많은 시간"에 대한 답

A1::copy_ctor 
A2::foo1 
A1::foo 
A1::copy_ctor 
A2::foo2 
A1::foo