Копировать конструктор в C ++ - PullRequest
0 голосов
/ 14 марта 2011
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);
}

Сколько раз вызывается конструктор копирования А1?Сколько раз вызывается конструктор копирования A2?

Может ли кто-нибудь научить меня этому?спасибо!

Ответы [ 2 ]

2 голосов
/ 14 марта 2011

Гораздо проще говорить о коде, который не использует имена переменных везде.

Конструктор копирования для 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 голос
/ 14 марта 2011

Слегка модифицируя ваш код для более явного вывода, у меня есть:

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

Который с использованием Xcode 3.2.5 дает:

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