【问题标题】:Making sense of non-primitive data types理解非原始数据类型
【发布时间】:2015-01-28 23:29:48
【问题描述】:
理解原始数据类型的工作原理很容易:计算机中的所有内容都存储为一系列 0 和 1,因此我需要存储的所有内容都需要编码为一系列 0 和 1。例如:实数3.14必须存储为位模式,负数-1234必须存储为位模式,字符'A'必须存储为位模式等。当我存储一个在内存中的这些数据中,我必须用特定的数据类型标记它们存储位置的内存位置(例如,float 表示一个实数的位模式),这个数据类型告诉我如何解释这个位稍后我要求时的模式。
但是这个定义如何适用于类之类的东西,我的意思是当我创建一个特定类的对象时,例如:
MyClass mc;
mc 不存储需要以特定方式解释的位模式,如何将类视为数据类型?还是有另一种数据类型的定义?
【问题讨论】:
标签:
c++
types
computer-science
【解决方案1】:
类或结构是其他数据类型的组合 - 复合数据类型 - 其中组成数据类型可以是原始数据类型或复合数据类型。
在以下示例场景中,X 和 Y 是两种复合数据类型。 Y 仅根据原始数据类型定义。 X 是根据原始数据类型定义的,Y。
struct Y
{
double* d;
char e;
}
struct X
{
float a;
int b;
Y c;
}
编译器决定如何定义X 和Y 的位模式。例如,Y 可能如下所示:
<8 bytes for double* d><1 byte for char e>
X 可能看起来像这样:
<4 bytes for float a><4 bytes for int b><9 bytes for Y c>
编译器为每个类或结构选择的特定位模式对于理解这个概念并不重要。重要的是编译器为每个类或结构选择一个特定的位模式,然后在任何地方始终如一地使用它。
【解决方案2】:
类和其他复合数据类型通常仅与其成员一起存储。位内容将取决于其数据成员的值。
所以给定以下类:
class MyClass
{
bool flag;
int number;
double d;
};
计算机将存储 flag 成员的 1 和 0,然后是一些填充(跳过字节),然后是 number 字段的 1 和 0,然后是更多填充,然后是 1 d 字段为 0。