2015-11-16 100 views
0

我不明白這是如何編譯的。它似乎不應該,如果我在構造函數中使用非NULL值,它不會。C++`int * class :: * member = NULL`編譯,爲什麼?

#include <stdio.h> 


class MyClass{ 
    private: 
     int *first; 
    public: 
     MyClass(); 
}; 

MyClass::MyClass(){ 

    int whatever = 42; 
    //int* MyClass::*first = &whatever;//This does not compile 
    int* MyClass::*first = NULL;//This compiles 
} 

int main(){ 

    MyClass doSomething; 
    return 1; 
} 

看來,通常被用於靜態瓦爾,這不是這種type Class::member = value語法。

另外,成員名稱前面有一個星號,這更加令人困惑。

如果我將行切換到註釋掉的行,編譯器會像預期的那樣抱怨。

error: cannot convert ‘int*’ to ‘int* MyClass::*’ in initialization 

雖然我確實希望發生錯誤,但我不知道int* MyClass::*是什麼類型。或者如何使用它。

+3

我不確定,但我懷疑你已經創建了一個指向成員變量的指針。 http://stackoverflow.com/questions/670734/c-pointer-to-class-data-member –

+0

嘗試'int * MyClass :: * first =&MyClass :: first;'。給它一個不同的名字可能會有點混亂。 –

+0

_static vars_在哪裏? – P0W

回答

0

這是一個指向數據成員的指針。你不能用一個普通的指針來初始化它,這就是爲什麼註釋掉的表達式不能編譯。