In Mr Kenny Kerr questa colonna, ha definito una struttura e un typedef come questo:
struct boolean_struct { int member; };
typedef int boolean_struct::* boolean_type;
allora qual è il significato di questo typedef?
Il typedef
crea un tipo chiamato boolean_type
che equivale a un puntatore a un membro int
all'interno di un oggetto boolean_struct
.
È non la stessa cosa a un puntatore a un int
. La differenza è che un oggetto di boolean_type
richiede un oggetto boolean_struct
per dereferenziarlo. Un puntatore normale a un int
non lo fa. Il modo migliore per vedere come questo è diverso è tramite alcuni esempi di codice.
consideri puntatori solo normali int
s:
struct boolean_struct { int member; };
int main()
{
// Two boolean_struct objects called bs1 and bs2 respectively:
boolean_struct bs1;
boolean_struct bs2;
// Initialize each to have a unique value for member:
bs1.member = 7;
bs2.member = 14;
// Obtaining a pointer to an int, which happens to be inside a boolean_struct:
int* pi1 = &(bs1.member);
// I can dereference it simply like this:
int value1 = *pi1;
// value1 now has value 7.
// Obtaining another pointer to an int, which happens to be inside
// another boolean_struct:
int* pi2 = &(bs2.member);
// Again, I can dereference it simply like this:
int value2 = *pi2;
// value2 now has value 14.
return 0;
}
Ora considerare se abbiamo utilizzato puntatori a int
membri all'interno di un boolean_struct
:
struct boolean_struct { int member; };
typedef int boolean_struct::* boolean_type;
int main()
{
// Two boolean_struct objects called bs1 and bs2 respectively:
boolean_struct bs1;
boolean_struct bs2;
// Initialize each to have a unique value for member:
bs1.member = 7;
bs2.member = 14;
// Obtaining a pointer to an int member inside a boolean_struct
boolean_type pibs = &boolean_struct::member;
// Note that in order to dereference it I need a boolean_struct object (bs1):
int value3 = bs1.*pibs;
// value3 now has value 7.
// I can use the same pibs variable to get the value of member from a
// different boolean_struct (bs2):
int value4 = bs2.*pibs;
// value4 now has value 14.
return 0;
}
Come si può vedere, la sintassi e il loro comportamento sono diverso.
Un'altra domanda riguarda il seguente codice:
operator boolean_type() const throw()
{
return Traits::invalid() != m_value ? &boolean_struct::member : nullptr;
}
Qual è il significato di "& boolean_struct :: membro"?
Restituisce l'indirizzo della variabile member
all'interno di boolean_struct
. Vedi esempio di codice sopra.
Grazie per la risposta. Ma non esiste alcun oggetto di boolean_struct, quindi a cosa puntano esattamente & boolean_struct :: member? – Rong
@Rong: ciò a cui punta è un dettaglio di implementazione del compilatore. Di solito è implementato come una sorta di offset intero in un membro della classe. Ma il suo esatto valore numerico è irrilevante; ciò che è importante è che ti consente di accedere a una parte specifica di un oggetto di un certo tipo, senza riguardo per un'istanza specifica di quel tipo. È come se stessi indicando un arto sul corpo umano; Posso farlo senza riguardo per un individuo. Ecco perché l'espressione 'boolean_struct :: member' funziona; Posso puntare a 'member' all'interno di' boolean_struct' senza riguardo a un'istanza specifica. –