访问非静态数据成员

时间:2015-11-08 19:30:01

标签: c++ static static-methods

我的讲师问了一个我无法找到满意答案的问题。引用他和#34; 只是告诉我一句为什么静态函数(方法)无法访问非静态数据成员?"你能告诉我为什么吗?我想学习。

3 个答案:

答案 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-methodstatic-member 在类的所有实例中是通用的。 因此,当您尝试访问 non-static 数据成员时,编译器无法确定该 non-static 数据成员的内存地址是什么。请记住,类只是一个模板,而对象是一个拥有地址并以类中定义的特定格式存储数据的对象。


举个例子:

  • 为了论证,让我们假设 C++ 静态方法允许我们访问非静态数据成员。让我们创建一个名为 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 ?因为静态成员函数不隶属于任何对象,所以它无法决定将什么作为输出。


那么现在也许很清楚为什么静态函数(方法)不能访问非静态数据成员?。如果您得到答案,希望您感谢您的努力。