假设我有一个具有静态功能的类。此函数在代码的另一部分被称为静态,而不实例化类对象。但是,这个静态函数在其代码中也具有对变量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;
}
答案 0 :(得分:2)
您的代码无法编译,因为静态函数使用的变量只存在于由类实例化的对象中。
我不确定你是否理解静态。仅存在一个静态函数。你可以从任何地方打电话。如果CExample的x应该使用哪个实例?
答案 1 :(得分:2)
这看起来像一个糟糕的设计案例。你可以修复它,使它通过使x静态并用5初始化来编译。但是你可能会更好地重新思考你的设计以及你想要它做什么。请记住,只有一个静态的实例,但是当你调用它的构造函数时,有很多CExample的实例。
答案 2 :(得分:1)
静态成员函数是类的服务,而不是类的特定对象。类的静态数据成员和静态成员函数独立于该类对象的实例化而存在。
使用静态函数不会调用其各自类的构造函数,因此您的变量将不存在,从而导致编译错误。
请记住,静态成员函数存在并独立于类的任何对象运行。
答案 3 :(得分: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