我的讲师问了一个我无法找到满意答案的问题。引用他和#34; 只是告诉我一句为什么静态函数(方法)无法访问非静态数据成员?"你能告诉我为什么吗?我想学习。
答案 0 :(得分:0)
static
方法,不需要该类的实例。
这意味着没有该类的实例,因此尚未创建和初始化非静态数据成员。
答案 1 :(得分:0)
您可以使用语法ClassName::MethodName()
调用静态方法。
在这种情况下,您不会访问具体对象,因此您不能
访问非静态成员。
请考虑以下代码:
class C {
public:
C(int i) { _i = i; }
int getI() { return _i; } // ok
/* error: using non-static member in a static method */
static int sgetI() { return _i; }
private:
int _i;
};
int main(void) {
C c1(1);
C c2(2);
int n1 = c1.getI(); // ok, n1 = 1
int n2 = c2.getI(); // ok, n2 = 2
int n3 = C::sgetI(); // what? does not make sense!
}
答案 2 :(得分:0)
static-method
和 static-member
在类的所有实例中是通用的。
因此,当您尝试访问 non-static
数据成员时,编译器无法确定该 non-static
数据成员的内存地址是什么。请记住,类只是一个模板,而对象是一个拥有地址并以类中定义的特定格式存储数据的对象。
举个例子:
person
的类,其中 name
作为字符串数据成员和两个方法 get_name()
和 put_name()
class person
{
string name;
public :
void get_name(){cin >> name;}
static void put_name(){cout << name << "\n";}
};
现在正在编写驱动程序...
int main()
{
person p1,p2;
p1.get_name(); // input : alice
p2.get_name(); // input : bob
person :: put_name();
return 0;
}
我们可以清楚地观察到将两个名字作为输入后,当我们调用put_name()
时,编译器会给出什么输出?爱丽丝、鲍勃还是 NULL ?因为静态成员函数不隶属于任何对象,所以它无法决定将什么作为输出。
那么现在也许很清楚为什么静态函数(方法)不能访问非静态数据成员?。如果您得到答案,希望您感谢您的努力。