"Capisco che Set è solo un puntatore alla matrice statica di 10 numeri interi"
No, è sbagliato: si tratta di un array, non un puntatore.
È ancora possibile inizializzarlo nell'elenco di inizializzazione del costruttore.
Per un compilatore che non supporta C++ 11 sostegni ricci di inizializzazione (Visual C++ versione 11 e precedenti viene in mente) si dovrà passare attraverso alcuni cerchi, però, come illustrato di seguito:
#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()
{}
Invece di usare matrici prime, però, utilizzare std::vector
e C+++ 11 std::array
, entrambi i quali sono supportati anche da Visual C++ 11.
fonte
2012-08-06 23:07:33
per quel che vale, 'set' non è solo un puntatore a un array di interi '10', né qui' static'. Piuttosto, il nome dell'array 'Set' decade in un puntatore al primo elemento dell'array in determinate situazioni. La differenza può essere vista chiaramente usando 'sizeof' - cioè' sizeof (Set) == 10 * sizeof (int)! = Sizeof (int *) '. –
@StuartGolodetz Grazie per il chiarimento. Quando ho detto statico, intendevo statico nella forma in cui è memorizzato con l'oggetto/istanza e non solo da qualche altra parte nell'heap. Naturalmente, questo è un grosso uso improprio del termine "statico" da parte mia; scusa. – Serge
Nessun problema :) Stavo solo cercando di chiarire la distinzione tra array e puntatori sulla possibilità che ci potesse essere un malinteso là. –