请考虑以下代码:
#include <iostream>
using namespace std;
class A
{
private:
int x;
public:
A(int _x) { x = _x; }
int get() { return x; }
};
class B
{
static A a;
public:
static int get()
{ return a.get(); }
};
int main(void)
{
B b;
cout << b.get();
return 0;
}
我在这里的疑问与这行代码有关:
public:
static int get()
{ return a.get(); }
根据此链接:为什么我只能从静态函数访问静态成员?,static
函数只能访问static
数据成员。但是,在此函数中,我们返回a.get()
.函数get()
在类A
中,返回x
,这是一个非static
变量。那么,这难道不与静态函数只能访问静态数据成员的事实相矛盾吗?
请指导。
你试图过多地解读"静态函数只能访问静态成员"的简单陈述。这并不是说对以任何方式接触任何实例数据的静态函数有某种总体禁止。(这样的事情到底有什么用?
将静态函数视为与根本不与类关联的函数更相似。您可以执行以下操作:
int foo()
{
A a;
return a.get();
};
或
A a;
int foo()
{
return a.get();
};
或其他变体,这很好。静态函数也是如此。
我们也许可以改写一些东西,比如"访问实例成员需要一个实例来访问它们,而静态函数可以在没有实例的情况下调用,因此没有实例成员本身可用",但这是更多的词,可能不太清楚回答常见的初学者问题为什么他们不能从静态函数访问他们类的成员。
静态函数只能访问静态数据成员。
这是正确的。
但是,在这个函数中,我们返回 a.get()。
是的,并且由于a
是静态数据成员,因此满足仅访问静态数据成员的要求。
结束。
真的,就是这样。故事到此结束。get()
内部发生的事情不再重要,get()
发生的事情是良好的还是不正确的,将取决于它本身的优点。
get()
不是static
类成员,但这不是仅静态规则适用的地方。仅静态规则适用于a
,因为它是B
的静态成员,而不是a.get()
。get()
是A
的非静态成员,因此它不会有任何困难,访问自己类的非静态成员。
规则是:静态成员只能访问其类的其他静态成员。规则不是:静态成员只能访问其类的其他静态成员,并且只能访问这些类的自己的静态成员,反过来,并且也只能永久访问这些类的静态成员。