Конструктор копирования вызывается более одного раза - PullRequest
0 голосов
/ 24 октября 2019

Ниже выводится код:

Default ctor is called
Copy ctor is called
Default ctor is called
Copy ctor is called
Copy ctor is called

Почему для каждого push_back() вызов конструктора копирования увеличивается на 1? Я думаю, что это должно быть вызвано только один раз. Есть что-то, что я здесь скучаю? пожалуйста, мне нужно подробное объяснение.

class A
{
public:
    A()
    {
        std::cout << "Default ctor is called" << std::endl;
    }
    A(const A& other)
    {
        if(this != &other)
        {
            std::cout << "Copy ctor is called" << std::endl;
            size_ = other.size_;
            delete []p;
            p = new int[5];
            std::copy(other.p, (other.p)+size_, p);
        }
    }
    int size_;
    int* p;
};
int main()
{
    std::vector<A> vec;
    A a;
    a.size_ = 5;
    a.p = new int[5] {1,2,3,4,5};
    vec.push_back(a);

    A b;
    b.size_ = 5;
    b.p = new int[5] {1,2,3,4,5};
    vec.push_back(b);

    return 0;
}

1 Ответ

1 голос
/ 24 октября 2019

Это потому, что push_back в вашем примере должен каждый раз перераспределять. Если вы reserve размера заранее, то вы увидите только одну копию.

std::vector<A> vec;
vec.reserve(10);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...