class Vala 中的成员与静态成员

class members vs. static members in Vala

看过https://wiki.gnome.org/Projects/Vala/Manual/Classes#Types_of_class_members,也测试过几次。结果,我假设这个

静态成员:可以在 class 及其子 class 及其所有实例中访问
class 成员:可以在 所有实例 中访问(一个 class 及其子 class 部分)

这样对吗?还有其他区别吗?

让我们使用 Vala 编译器的 --ccode 开关进行检查:

public class Test {
    public static int static_member;
    public class int class_member;
    public int instance_member;
}

编译时会产生这些C数据结构(我只展示重要的部分):

struct _Test {
        gint instance_member;
};

struct _TestClass {
        gint class_member;
};

extern gint test_static_member;

静态成员不存储在属于class的任何结构中,而是一个全局变量。它仍然使用 class 前缀限定范围(因此 "test_" 是前缀)以避免与其他全局变量或其他 classes.

的静态成员名称冲突

class成员存储在"class structure"中,实例成员存储在"instance structure"中。

"class structure" 可以通过派生 class 来扩展,但除此之外,对于每个 class,您通常只有一个 "class structure" 实例(这是他们为什么这样命名)。

每次创建新实例时,"instance structure" 都会保存所有实例数据。

要全面了解这些机制,您必须了解一些 C 语言并阅读 GObject 手册。