Don't forget std::array, which can be easily emulated if your compiler/stdlib doesn't ship with it.
It gives you all the advantages of std::vector (consistent C++ interface) and the advantages of a C array (fixed size, no dynamic free store allocation, no extraneous size/capacity/pointer space taken up). You can use std::array::fill, e.g.:
class foo {
std::array<int, 2> _stuff;
public:
foo() {
_stuff.fill(1);
};
There is no constructor to pre-initialize the values other than via initializer lists.
Note that you can also easily fill in a C array with a single value in C++ in a very similar way, too:
int array[4];
// fill all four elements with 1
std::fill(std::begin(array), std::end(array), 1);
Remember that std::begin and std::end are free functions that return a begin and end iterator (respectively) for their argument and should be used from now on in place of the member function variants. Normally you should not explicitly use their namespace so that they work with ADL, but primitive types (like C arrays) don't participate in ADL so you need them here (or you need "using std::begin"/"using std::end" in scope).
And again, if your compiler lacks these, you can write them easily (and they're worth having) for C arrays, along with a handy size function (and you can support general containers with a little overloading and SFINAE work, which I leave as an exercise for the reader):
template <typename T, size_t N>
T* begin(T(&v)[N]) { return v; }
template <typename T, size_t N>
T* end(T(&v)[N]) { return v + N; }
template <typename T, size_t N>
N size(T(&)[N]) { return N; }