2011-03-14 6 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); 
} 

Combien de fois le constructeur de copie de A1 est-il invoqué? Combien de fois le constructeur de copie de l'A2 est-il invoqué?constructeur de copie en C++

Est-ce que n'importe qui peut m'enseigner ceci? Merci!

+6

Pour la réponse à , vous pouvez mettre quelque chose comme 'cout <<" dans le ctor de A1 "<< endl;' dans les constructeurs et lancer le code pour voir par vous-même. –

+0

@Martinho - Si vous étiez encore plus paresseux, vous pourriez faire 'static int i = 0; std :: cout << ++ i << "e temps en A1" << std :: endl; ' –

Répondre

2

Il est beaucoup plus facile de parler de code qui ne réutilise pas les noms de variables partout.

Le constructeur de copie pour A1 est appelé deux fois, et pour A2 pas du tout.

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

Modifier votre code légèrement pour une sortie plus explicite, j'ai:

#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); 
} 

qui utilisant Xcode 3.2.5 rendements: "Combien de fois"

A1::copy_ctor 
A2::foo1 
A1::foo 
A1::copy_ctor 
A2::foo2 
A1::foo 
Questions connexes