1

对不起,如果问题是旧的或有点愚蠢。

我知道声明和定义的基础知识,但在 C++ 中似乎有很多不一致或“例外”,这使得它不和谐,至少对我来说是这样。或者,我误解了什么。

所以,在头文件中,我们声明了一些变量并定义了类类型(也听说过“类声明”,不知道哪个更准确);在每个类中,我们声明成员变量和函数。然后在一些 .cc/.cpp 文件中,我们只定义成员函数来实现类。如果“不幸”有一个静态成员变量/函数,它被认为是特殊的并且完全独立于关联的类,它必须在类之外定义,作为成员变量中唯一的一种“怪胎”。

当 .cpp 文件#includesa定义类类型的头文件时(请注意,该头文件中的类类型定义似乎“不完整”,因为它的功能在其他地方定义。),.cpp 文件将类类型定义放在开头,以及其他可能的声明

在.cpp文件中,#included类的静态成员变量已经在实现.cpp中连同成员函数一起定义了,那么如果创建了类的实例,那么非静态的“普通”成员变量呢?假设它是Class A;,那么非静态成员变量是否会被定义A a;?当然定义a了一个类型A的对象,但是它的非静态成员变量是否也被定义(在分配内存的意义上定义)如果是这样,那么两个相同类型的对象,比如说和,完全可以在一起,因为和有不同的a1a2Aa1.mem_var_1a2.mem_var_1关于不同类实例名称的定义?或者,它们共享“相同的定义”但具有不同的值和副本?

成员函数呢?它们已经在类类型的.cpp文件中定义了,但是当我们创建多个实例时,它们不会在.cpp中共享相同的定义但在内存中有不同的副本(我猜是同一个成员函数的多个副本至少对于内部局部变量的不同值是必要的)?静态函数呢?

或者,我误解了一些东西,因为我们程序员定义”文件中的某些东西不等于编译器和链接器定义”文件中的东西?定义的真正作用和含义是什么?我们在一个文件中写入“定义”某些东西,但系统可以“定义”不同的东西,至少在秘密制作多个副本和东西的意义上?

我头痛...

4

1 回答 1

-1

这背后的原因是历史原因。发明 C 时,内存和处理器既小又贵。如果您的项目有 20 个文件,编译器就无法将所有文件加载到内存中并解析符号。解决意味着为每个函数、结构和变量分配足够且正确的空间。

现在,假设我们有 2 个 cpp 文件,一个定义 struct String,另一个定义 struct Rectangle。为了让函数在两个文件中都使用 String 和 Rectangle,编译器需要加载这两个文件并分析它们。那些时候,这将是一个非常占用内存的操作。

因此,一些额外的文件,标题被采用。这些头文件只是告诉编译器有关 cpp 使用的每种类型的内存信息。然后编译器能够仅基于 cpp 文件和所有依赖的头文件编译成 obj 文件。

编译完所有 cpp 后,就会出现链接,将所有 obj 文件放在一起。现在至关重要的是,在所有 cpp 中以相同的方式定义变量,否则一些 cpp 将使用 8 字节的 Rectangle,而另一个 cpp 将使用 12 字节的 Rectangle,当放在一起时 -> bang!

于 2015-07-07T20:33:36.650 回答