Стандартная конструкция элементов в векторе - PullRequest
6 голосов
/ 18 мая 2009

При чтении ответов на этот вопрос у меня возникло сомнение относительно построения по умолчанию объектов в векторе. Чтобы проверить это, я написал следующий тестовый код:

struct Test
{
    int m_n;

    Test(); 

    Test(const Test& t);

    Test& operator=(const Test& t);
};

Test::Test() : m_n(0)
{
}

Test::Test(const Test& t)
{
    m_n = t.m_n;
}

Test& Test::operator =(const Test& t)
{
    m_n = t.m_n;
    return *this;
}


int main(int argc,char *argv[])
{
    std::vector<Test> a(10);
    for(int i = 0; i < a.size(); ++i)
    {
        cout<<a[i].m_n<<"\n";
    }

    return 0;
}

И конечно же, при создании векторного объекта вызывается конструктор по умолчанию для тестовых структур. Но что я не могу понять, так это как STL инициализирует объекты, которые я создаю, для вектора базового типа данных, такого как вектор целых чисел, поскольку для него есть конструктор по умолчанию? то есть как все целые числа в векторе имеют значение 0? не должно ли это быть мусором?

Ответы [ 2 ]

10 голосов
/ 18 мая 2009

Он использует эквивалент конструктора по умолчанию для целых чисел, который должен обнулять их инициализацию. Вы можете сделать это явно:

int n = int();

установит n на ноль.

Обратите внимание, что конструкция по умолчанию используется и требуется только в том случае, если для вектора задан начальный размер. Если бы вы сказали:

vector <X> v;

не требуется, чтобы X имел конструктор по умолчанию.

1 голос
/ 18 мая 2009
std::vector<Type> a(10);        // T could be userdefined or basic data type

Вектор в основном вызывает default для типа, на который он указывает: Type()

  • если это базовый тип данных, такой как int, double тогда int (), double () {int () получит значение 0}
  • если пользователь определил тип данных, то конструктор по умолчанию будет вызван.
...