C++静态成员函数及其作用域

use*_*514 1 c++ scope

我有两个问题.

在C++中,静态成员函数可以直接访问在同一个类中定义的公共非静态数据成员吗?假

在C++中,非静态成员函数可以直接访问在同一个类中定义的私有静态数据成员吗?真正

我的笔记对第一个问题说错误,对第二个问题说错.我只是找不到原因?你能解释一下这是为什么吗?谢谢.

PS我正在为我的决赛而学习,我似乎无法弄明白为什么.

Ste*_*sop 13

每个人都同意,但应该非常小心他们的措辞,因为实际上静态成员函数确实可以访问公共非静态数据成员.就此而言,他们也可以访问私有非静态数据成员.他们只需要一个操作对象来访问其成员.这可以是参数,也可以是全局的,或者在静态成员函数中创建,或者通过其中一个获取.

以下代码没问题:

class foo {
public:
    int a;
    // static member function "get_a" ...
    static int get_a(foo *f) {
        // ... accesses public non-static data member "a"
        return f->a;
    }
};
Run Code Online (Sandbox Code Playgroud)

所以我们问自己,"访问"和"直接访问"之间有什么区别?

我猜这里"直接访问"的含义必须是"仅使用数据成员的名称,而不指定对象".每个人总是需要一个对象才能访问非静态成员 - 这就是非静态的意思.非静态成员函数如果不想要,则不必提及哪个对象,因为它this是隐式的.因此,他们对非静态数据成员的访问可以是直接的.

非静态成员函数直接访问私有静态数据成员的原因首先是代码属于类的成员,因此它可以访问私有数据成员.其次,您永远不需要一个对象来访问静态数据成员(如果需要,您可以指定一个,但所有使用的是表达式的静态类型,而不是实际对象),因此访问是直接的.


Gre*_*ill 5

这是一个提示:回想一下,"非静态数据成员"是指类的特定实例的数据成员.静态成员函数不会在任何特定实例的上下文中运行.