在肯尼先生克爾的本專欄中,他定義的結構和像 這樣一個typedef:
struct boolean_struct { int member; };
typedef int boolean_struct::* boolean_type;
那麼這是什麼類型定義的含義是什麼?
的typedef
創建一個名爲boolean_type
型這相當於一個指針指向一個boolean_struct
對象內部的int
構件。
這是不是相同的東西到一個指向int
的指針。區別在於boolean_type
的對象需要一個boolean_struct
對象才能對其進行解引用。指向int
的普通指針沒有。瞭解這種情況的最好方法是通過一些代碼示例。
只考慮正常指針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;
}
現在考慮,如果我們用指針來int
成員內部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;
}
正如你所看到的,語法和他們的行爲是不同。
另一個問題是關於下面的代碼:
operator boolean_type() const throw()
{
return Traits::invalid() != m_value ? &boolean_struct::member : nullptr;
}
什麼是 「& boolean_struct ::成員」 的含義是什麼?
這將返回boolean_struct
中member
變量的地址。參見上面的代碼示例。
感謝您的回答。但是沒有boolean_struct的對象,那麼&boolean_struct :: member究竟指向了什麼? – Rong 2012-03-18 07:20:19
@Rong:它指向的是編譯器的實現細節。它通常作爲某種類型的整數偏移量實現到類成員中。但其確切的數值是無關緊要的;重要的是它允許您訪問特定類型的對象的特定部分,而不考慮該類型的特定實例。就像我指着人體上的肢體;我可以做到這一點,而不考慮個人。這就是爲什麼表達式'boolean_struct :: member'起作用的原因;我可以指向'boolean_struct'中的'member'而不考慮特定的實例。 – 2012-03-18 12:32:04