Correct way to initialize vector member variable

C++

C++ Problem Overview


// Method One
class ClassName
{
public:
	ClassName() : m_vecInts() {}

private:
	std::vector<int> m_vecInts;
}

// Method Two
class ClassName
{
public:
	ClassName() {} // do nothing

private:
	std::vector<int> m_vecInts;
}

Question> What is the correct way to initialize the vector member variable of the class? Do we have to initialize it at all?

C++ Solutions


Solution 1 - C++

See http://en.cppreference.com/w/cpp/language/default_initialization >Default initialization is performed in three situations: > >1. when a variable with automatic storage duration is declared with no initializer >2. when an object with dynamic storage duration is created by a new-expression without an initializer >3. when a base class or a non-static data member is not mentioned in a constructor initializer list and that constructor is called. > > The effects of default initialization are: > >- If T is a class type, the default constructor is called to provide the initial value for the new object. >- If T is an array type, every element of the array is default-initialized. >- Otherwise, nothing is done.

Since std::vector is a class type its default constructor is called. So the manual initialization isn't needed.

Solution 2 - C++

It depends. If you want a size 0 vector, then you don't have to do anything. If you wanted, say, a size N vector fill of 42s then use the constructor initializer lists:

ClassName() : m_vecInts(N, 42) {}

Solution 3 - C++

Since C++11, you can also use list-initialization of a non-static member directly inside the class declaration:

class ClassName
{
public:
    ClassName() {}

private:
    std::vector<int> m_vecInts {1, 2, 3}; // or = {1, 2, 3}
}

Solution 4 - C++

You do not have to initialise it explcitly, it will be created when you create an instance of your class.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionq0987View Question on Stackoverflow
Solution 1 - C++ZetaView Answer on Stackoverflow
Solution 2 - C++juanchopanzaView Answer on Stackoverflow
Solution 3 - C++mrtsView Answer on Stackoverflow
Solution 4 - C++mathematician1975View Answer on Stackoverflow