7

次のコードをテストしました。

#include <iostream>
#include <vector>

class foo {
public:
    int m_data;
    foo(int data) : m_data(data) {
        std::cout << "parameterised constructor" << std::endl;
    }
    foo(const foo &other) : m_data(other.m_data) {
        std::cout << "copy constructor" << std::endl;
    }
};

main (int argc, char *argv[]) {
    std::vector<foo> a(3, foo(3));
    std::vector<foo> b(4, foo(4));
    //std::vector<foo> b(3, foo(4));
    std::cout << "a = b" << std::endl;
    a = b;
    return 0;
}

私は得る

   parameterised constructor
   copy constructor
   copy constructor
   copy constructor
   parameterised constructor
   copy constructor
   copy constructor
   copy constructor
   copy constructor
   a = b
   copy constructor
   copy constructor
   copy constructor
   copy constructor

std::vector<foo> b(4, foo(4));ただし、コピーコンストラクターで置き換えると、std::vector<foo> b(3, foo(4));呼び出されa = bず、出力は

parameterised constructor
copy constructor
copy constructor
copy constructor
parameterised constructor
copy constructor
copy constructor
copy constructor
a = b

この場合、コピー コンストラクターが呼び出されないのはなぜですか?

g++ (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1 を使用しています

4

2 に答える 2

12

最初のケースでaは、割り当て時に成長する必要があります。つまり、すべての要素を再割り当てする必要があります (したがって、破棄して構築する必要があります)。

2 番目のケースでaは、拡張する必要がないため、代入演算子が使用されます。

http://ideone.com/atPt9を参照してください。メッセージを出力するオーバーロードされたコピー代入演算子を追加すると、2 番目の例では次のようになります。

parameterised constructor
copy constructor
copy constructor
copy constructor
parameterised constructor
copy constructor
copy constructor
copy constructor
a = b
copy assignment
copy assignment
copy assignment
于 2012-04-25T10:44:04.940 に答える
3

代入演算子を使用しています。

#include <iostream>
#include <vector>

class foo {
public:
    int m_data;
    foo(int data) : m_data(data) {
        std::cout << "parameterised constructor " << m_data << std::endl;
    }
    foo(const foo &other) : m_data(other.m_data) {
        std::cout << "copy constructor " << m_data << " " << other.m_data << std::endl;
    }

    foo& operator= (const foo& other){
        std::cout << "assignment operator " << m_data << " " << other.m_data << std::endl;
    }
};

main (int argc, char *argv[]) {
    std::vector<foo> a(3, foo(3));
    //std::vector<foo> b(4, foo(4));
    std::vector<foo> b(3, foo(4));
    std::cout << "a = b" << std::endl;
    a = b;

    for(std::vector<foo>::const_iterator it = a.begin(); it != a.end(); ++it){
        std::cout << "a " << it->m_data << std::endl;
    }
    for(std::vector<foo>::const_iterator it = b.begin(); it != b.end(); ++it){
        std::cout << "b " << it->m_data << std::endl;
    }
    return 0;
}
parameterised constructor 3
copy constructor 3 3
copy constructor 3 3
copy constructor 3 3
parameterised constructor 4
copy constructor 4 4
copy constructor 4 4
copy constructor 4 4
a = b
assignment operator 3 4
assignment operator 3 4
assignment operator 3 4
a 3
a 3
a 3
b 4
b 4
b 4

理由については、オリスの回答を参照してください。

于 2012-04-25T10:44:10.000 に答える