访问类外的非静态数据成员

Access non static data member outside class

本文关键字:静态 数据成员 访问      更新时间:2023-10-16

是否可以访问类外的非静态数据成员?假设您有一个像下面这样的示例。我知道它作为一个例子没有多大意义,但我只是想了解如何访问非静态数据成员。如果编译以下代码,它会生成一个错误:

 C.h|70|error: invalid use of non-static data member ‘C::age’|
//刘昀

class C{
  public:
    int age;
};
 int getAge();
//C.cpp

C::C()
{
    age  = 0;
}
int getAge(){
   return (C::age);
}

非静态成员依赖于实例。当一个有效的实例初始化时,它们被初始化。

示例的问题在于,它试图通过类接口访问非静态成员,而不首先初始化具体实例。这是无效的。

你可以把它改成static:

class C{
public:
    static int age;
};

要求您在运行时使用int C::age = 0之前还定义age。注意,如果使用此方法,C::age的值可以在运行时更改。

或者,您可以将其设置为const static并直接初始化,如:

class C{
public:
    const static int age = 0;
};

本例中C::age的值为const

这两种方法都可以让您在没有实例的情况下获得它:C::age .

如果不将其设置为静态,则必须创建一个值:

左值:

C c;
return c.age;

或右值:

return C().age;
// or
return C{}.age;

您的代码的问题是,您试图访问age成员,而不创建类的实例。类的非静态数据成员只能通过类的实例访问,在您的示例中没有创建实例。

不能这样做的原因是,局部变量是在运行时分配到堆栈上的——如果你真的想使用一些内联asm,你可以获得它的位置,但它需要一些调试来获得堆栈位置,并且在函数之后,你想访问它,它更有可能被其他东西覆盖。