-2

可以说我有一个带有静态函数的类。该函数被代码的另一部分调用为静态函数,而不实例化类对象。然而,这个静态函数在其代码中也依赖于变量 x。但是,x 仅被初始化为某个值或在构造函数中被清除。但是,鉴于没有实例化类的对象,我相信该变量是未定义的。所以,我有几个问题:

1)是否调用了构造函数?

2) 变量 x 是否未定义?

我怎样才能解决这样的情况?

在下面的示例中,我希望 y 为 25,但可以吗?

class CExample
{
public:

    CExample(void);
    ~CExample(void);
    static void foo();

    int x;
};

CExample::CExample()
{
    x = 5;
}


void CExample::foo()
{
    int y = x*5;

}
4

4 回答 4

2

您的代码无法编译,因为静态函数使用的变量仅存在于类实例化的对象中。

我不确定你是否理解静态。只有一个静态函数存在。您可以从任何地方调用它。如果 CExample 的 x 应该使用哪个实例?

于 2013-01-08T21:30:42.400 回答
2

这看起来像是一个糟糕的设计案例。您可以修复它,以便通过将 x 设为静态并使用 5 对其进行初始化来编译它。但是,您可能会更好地重新考虑您的设计以及您想要它做什么。请记住,只有一个静态事物的实例,但 CExample 的实例与您将其称为构造函数的次数一样多。

于 2013-01-08T21:34:43.997 回答
1

静态成员函数是类的服务,而不是类的特定对象的服务。类的静态数据成员和静态成员函数独立于该类对象的实例化而存在。

使用静态函数不会调用其各自类的构造函数,因此你的变量将不存在,导致编译错误。

只要记住静态成员函数的存在和操作独立于类的任何对象。

于 2013-01-08T21:34:14.103 回答
0

从静态函数访问非静态成员是非法的。当我尝试编译您的程序时,请查看 gcc 的输出:

test.cpp: In static member function ‘static void CExample::foo()’:
test.cpp:9: error: invalid use of member ‘CExample::x’ in static member function
于 2013-01-08T21:32:51.850 回答