在变量依赖于构造函数的类中使用静态函数

Using static function in class where a variable depends on constructor

本文关键字:静态函数 变量 依赖于 构造函数      更新时间:2023-10-16

假设我有一个静态函数的类。此函数由代码的另一部分作为静态调用,而无需实例化类对象。然而,这个静态函数在其代码中也依赖于变量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;
}

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

我不确定你是否理解static。只有一个静态函数。你可以在任何地方打电话。哪个实例,如果CExample的x应该使用?

这看起来像是一个糟糕的设计。您可以通过将x设置为静态并将其初始化为5来修复它,以便它可以编译。然而,你最好重新思考你的设计和你想要它做什么。记住,静态的东西只有一个实例,但是CExample的实例和你调用它的构造函数的次数一样多

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

使用静态函数不会调用相应类的构造函数,因此变量将不存在,从而导致编译错误。

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

从静态函数访问非静态成员是非法的。当我尝试编译你的程序时,看看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