"I understand that Set is just a pointer to the static array of 10 integers"
No, that's wrong: it's an array, not a pointer.
You can still initialize it in the constructor's initializer list.
For a compiler that doesn't support C++11 curly braces initialization (Visual C++ version 11 and earlier comes to mind) you'll have to jump through some hoops though, as shown below:
#include <iostream> #include <vector> using namespace std; #define CPP11 #if defined( _MSC_VER ) # if (_MSC_VER <= 1700) # undef CPP11 # endif #endif #ifdef CPP11 class Cpp11 { private: int set_[10]; public: Cpp11() : set_{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 } {} int foo() const { return set_[3]; } }; #endif class Cpp03 { private: struct IntArray10 { int values[10]; }; IntArray10 set_; static IntArray10 const& oneToTen() { static IntArray10 const values = { {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} }; return values; } public: Cpp03() : set_( oneToTen() ) {} int foo() const { return set_.values[3]; } }; int main() {}
Instead of using raw arrays, though, use std::vector and C+++11 std::array, both of which are supported even by Visual C++ 11.
Setisn't just a pointer to an array of10integers, nor is itstatichere. Rather, the array nameSetdecays to a pointer to the first element of the array in certain situations. The difference can be seen clearly usingsizeof- i.e.sizeof(Set) == 10 * sizeof(int) != sizeof(int*).staticon my part; sorry.