1 #include<string> 2 #include<iostream> 3 using namespace std; 4 class TextBlock 5 { 6 public: 7 TextBlock():text("hello") {} 8 const char& operator[](size_t position) const{ return text[position]; } 9 char& operator[](size_t position){ return text[position]; } 10 11 /* static */ void print(const TextBlock& tb){ cout << tb[0]; } 12 private: 13 string text; 14 }; 15 16 int main() 17 { 18 TextBlock B; 19 20 TextBlock::print(B); 21 /* B.print(B); */ 22 system("pause"); 23 }
在VS2013里輸入以上代碼會報錯:非靜態成員引用必須與特定對象相對。
類的成員有兩種:靜態成員和實例成員(包括實例和函數)。實例成員的存儲空間屬於具體的實例,不同實例(對象)的同名成員擁有不同的存儲空間;靜態成員的存儲空間是固定的,與具體的實例(對象)無關,被該類的所有實例共享。
訪問靜態成員可以用ClassName::MemberName,也可以用ClassName.MemberNme,但最好用前者,因為很容易就可以判定成員是靜態成員。
訪問實例成員只能用ClassName.MemberName,不能用ClassName::MemberName.
本例中就是因為用ClassName::MemberName訪問實例變量出錯。
所以解決方法是:將以上類的成員函數print聲明為static。或者函數調用時用ClassName.MemberName的方式。