Java C++;成员变量语义

Java C++;成员变量语义,java,c++,Java,C++,我有一个相当简单的问题,答案是什么 我的一般问题是: 当您声明一个成员变量(无论是公共变量还是私有变量)以及所有变量类型的排列(例如静态变量vs常量变量vs正则变量)时,实际发生了什么 class some_class { private: static const std::string str; public: ... } 我意识到C++中没有一个非变量的概念,也就是说,一个非构造变量,就像我教过的那样,相信存在着像java这样的语言。在Java中也可能是这样,但是这不是我被教导思

我有一个相当简单的问题,答案是什么

我的一般问题是: 当您声明一个成员变量(无论是公共变量还是私有变量)以及所有变量类型的排列(例如静态变量vs常量变量vs正则变量)时,实际发生了什么

class some_class
{
private:
    static const std::string str;
public:
...
}
<>我意识到C++中没有一个非变量的概念,也就是说,一个非构造变量,就像我教过的那样,相信存在着像java这样的语言。在Java中也可能是这样,但是这不是我被教导思考问题的方式,所以我试图找到正确的方式来思考这些未初始化的变量

public class main {
    public static void main(String[] args) {
        String str; // A kind of non-variable, or non-constructed variable (refers to null).
        str = new String(); // Now this variable actually refers to an object rather than null, it is a constructed variable.
    }
}

因为C++允许你通过初始化列表初始化构造函数中的成员变量,并且我已经通过使用调试器证明了自己,在变量通过初始化器列表(显式地或默认地)初始化之前不存在,那么,当您声明成员变量时,实际上是在幕后进行的吗?

这是一个棘手的问题——根据角度的不同,它是不明确的

从伪机器的角度来看,通常向类添加非静态的普通旧数据类型会使该类类型更大。编译器还计算出如何将其与相对内存偏移对齐,以相对于生成的机器代码中的对象对其进行寻址

这是伪机器级别,因为在机器级别,数据类型实际上并不存在:只有原始位和字节、寄存器、指令等等

当您添加一个非基本用户定义类型时,它会递归,编译器会生成指令来访问该成员的成员,依此类推

从更高的级别上讲,向类添加成员可以从类的实例(对象)访问该成员。构造函数初始化这些成员,析构函数销毁它们(递归地触发具有非平凡析构函数的成员的析构函数,对于构造阶段的构造函数也是如此)

然而,您的示例是一个静态成员。对于静态成员,它们存储在机器级别的数据段中,编译器生成代码从数据段访问这些静态成员

其中一些可能有点令人困惑。C++与C语言共享其遗产,它是一种硬件级语言,其静态编译和链接影响其设计。因此,虽然它可以达到相当高的层次,但它的许多构造仍然与硬件、编译器和链接器的工作方式有关,而在Java中,这种语言可以做出一些更明智的选择,有利于程序员的方便,而不需要某种程度上反映所有这些东西的语言设计。

棘手的问题——根据角度的不同,它是不明确的

从伪机器的角度来看,通常向类添加非静态的普通旧数据类型会使该类类型更大。编译器还计算出如何将其与相对内存偏移对齐,以相对于生成的机器代码中的对象对其进行寻址

这是伪机器级别,因为在机器级别,数据类型实际上并不存在:只有原始位和字节、寄存器、指令等等

当您添加一个非基本用户定义类型时,它会递归,编译器会生成指令来访问该成员的成员,依此类推

从更高的级别上讲,向类添加成员可以从类的实例(对象)访问该成员。构造函数初始化这些成员,析构函数销毁它们(递归地触发具有非平凡析构函数的成员的析构函数,对于构造阶段的构造函数也是如此)

然而,您的示例是一个静态成员。对于静态成员,它们存储在机器级别的数据段中,编译器生成代码从数据段访问这些静态成员

其中一些可能有点令人困惑。C++与C语言共享其遗产,它是一种硬件级语言,其静态编译和链接影响其设计。因此,虽然它可以达到相当高的层次,但它的许多构造仍然与硬件、编译器和链接器的工作方式有关,而在Java中,这种语言可以做出一些更明智的选择,有利于程序员的方便,而不需要某种程度上反映所有这些东西的语言设计。

棘手的问题——根据角度的不同,它是不明确的

从伪机器的角度来看,通常向类添加非静态的普通旧数据类型会使该类类型更大。编译器还计算出如何将其与相对内存偏移对齐,以相对于生成的机器代码中的对象对其进行寻址

这是伪机器级别,因为在机器级别,数据类型实际上并不存在:只有原始位和字节、寄存器、指令等等

当您添加一个非基本用户定义类型时,它会递归,编译器会生成指令来访问该成员的成员,依此类推

从更高的级别上讲,向类添加成员可以从类的实例(对象)访问该成员。构造函数初始化这些成员,析构函数销毁它们(递归地触发具有非平凡析构函数的成员的析构函数,对于构造阶段的构造函数也是如此)

然而,您的示例是一个静态成员。对于静态成员,它们存储在机器级别的数据段中,编译器生成代码从数据段访问这些静态成员

其中一些可能有点令人困惑。C++与C语言共享其遗产,它是一种硬件级语言,其静态编译和链接影响其设计。因此,虽然它可以达到相当高的层次,但它的许多构造仍然与硬件、编译器和链接器的工作方式有关,而在Java中,该语言可以使一些内容更具意义
static const int size = 1234;