非静态成员引用必须与特定对象相对
数据成员可以分静态变量、非静态变量两种.
**静态成员:**静态类中的成员加入static修饰符,即是静态成员.可以直接使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静态成员需要实例化才会分配内存,所以静态成员不能访问非静态的成员…因为静态成员存在于内存,所以非静态成员可以直接访问类中静态的成员.
非成静态员:所有没有加Static的成员都是非静态成员,当类被实例化之后,可以通过实例化的类名进行访问..非静态成员的生存期决定于该类的生存期…而静态成员则不存在生存期的概念,因为静态成员始终驻留在内容中…
eg:
#include<string>
#include<iostream>
using namespace std;
class TextBlock
{
public:
TextBlock():text("hello") {}
const char& operator[](size_t position) const{ return text[position]; }
char& operator[](size_t position){ return text[position]; }
/* static */ void print(const TextBlock& tb){ cout << tb[0]; }
private:
string text;
};
int main()
{
TextBlock B;
TextBlock::print(B);
/* B.print(B); */
system("pause");
}
在VS2013里输入以上代码会报错:非静态成员引用必须与特定对象相对。
类的成员有两种:静态成员和实例成员(包括实例和函数)。实例成员的存储空间属于具体的实例,不同实例(对象)的同名成员拥有不同的存储空间;静态成员的存储空间是固定的,与具体的实例(对象)无关,被该类的所有实例共享。
访问静态成员可以用ClassName::MemberName,也可以用ClassName.MemberNme,但最好用前者,因为很容易就可以判定成员是静态成员。
访问实例成员只能用ClassName.MemberName,不能用ClassName::MemberName.
本例中就是因为用ClassName::MemberName访问实例变量出错。
所以解决方法是:将以上类的成员函数print声明为static。或者函数调用时用ClassName.MemberName的方式。