2012-03-16 86 views
7

在肯尼先生克爾的this column,他定義的結構和類型定義是這樣的:這個typedef是什麼意思?

struct boolean_struct { int member; }; 
typedef int boolean_struct::* boolean_type; 

那麼這是什麼類型定義的含義是什麼?

另一個問題是關於下面的代碼:

operator boolean_type() const throw() 
{ 
    return Traits::invalid() != m_value ? &boolean_struct::member : nullptr; 
} 

什麼是 「& boolean_struct ::成員」 的含義是什麼?

回答

13

在肯尼先生克爾的本專欄中,他定義的結構和像 這樣一個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_structmember變量的地址。參見上面的代碼示例。

+0

感謝您的回答。但是沒有boolean_struct的對象,那麼&boolean_struct :: member究竟指向了什麼? – Rong 2012-03-18 07:20:19

+1

@Rong:它指向的是編譯器的實現細節。它通常作爲某種類型的整數偏移量實現到類成員中。但其確切的數值是無關緊要的;重要的是它允許您訪問特定類型的對象的特定部分,而不考慮該類型的特定實例。就像我指着人體上的肢體;我可以做到這一點,而不考慮個人。這就是爲什麼表達式'boolean_struct :: member'起作用的原因;我可以指向'boolean_struct'中的'member'而不考慮特定的實例。 – 2012-03-18 12:32:04