C++ static 与 C 中的 static 相同吗?
Is C++ static same as static in C?
我正在为 CPP 中的 static
关键字而苦恼。
经过我的实验我发现:
static
成员不在 class 里面。我计算了添加静态成员前后class的大小,发现是一样的。
我想到的一种解释是,也许 class 名称变成了名称 space(此静态成员的范围)?该成员不在 class?
- 函数不在 class 内部,函数有一个隐式参数,如对象指针。然而,如果 class 中没有字段但有一堆功能,为什么 class 的大小将是一个而不是 0?但指针是否也为函数提供了一个范围,允许函数访问私有成员或函数自身具有 class 名称space.
- 我们可以同时使用 class 名称和对象来访问静态字段和函数,为什么我们可以这样做。如果 class 名称是静态函数的名称 space,为什么我们可以使用对象来访问它?对象本身是否具有 class 名称space?
- 然后我尝试在class中声明和定义一个静态成员,当然失败了,但我想知道为什么?为什么我们不能在 class 中初始化它?
XD 英语不是我的母语,请原谅我的语法错误。
static
在 C++ 中与在 C 中具有相同的语义:
- 对于变量,它定义了 "global" 个具有单个实例的变量,并且只能在有限的范围内访问。这个限定范围是:
- 编译单元,如果变量是在函数之外定义的。 请注意,可以在具有显式范围解析的整个编译单元中访问命名空间中定义的静态变量。
- 函数的范围,如果它是在函数中定义的,
- 对于函数,它限制了它们对编译单元的可见性。
在 classes 的上下文中,存在细微差别。 static 在这里意味着变量或函数独立于 class:
的对象
- 对于成员变量,这意味着只有一个变量实例,由 class 的所有成员共享。 请注意,如果要将其初始化为特定值,除了在 class 中声明外,还必须在某处定义它。
- 对于成员函数,这意味着函数不能依赖非静态成员
关键字 static
在 C 中已经严重重载,C++ 增加了一个
一些额外的含义。对于 static
含义的任何真正讨论,
您需要指定上下文:在命名空间范围内,static
影响什么
called linkage:被声明的名称是否指代中的同一个实体
不同的来源,或仅在这一个特定来源中。在其他地方,对于数据,
它指定实体的生命周期,不是实体名称的绑定
实体:静态成员变量只有一个实例,它存在
独立于包含它的 class 的任何实例。如果是会员
函数是静态的,这意味着它没有 this
指向特定的指针
实例,并且可以在没有任何实例的情况下被调用。
关于您的具体问题:
静态成员 不是 class 的任何实例的一部分,因此它不会影响 [=49] 的大小=](实际上是其实例的大小)。静态成员在范围和访问控制方面仍然是成员,但它具有静态生命周期,并且存在于 class.
的任何实例之外
具体对象的sizeof
不能为零,因为即使它不包含任何数据,它也不能与内存中的任何其他对象具有相同的地址;如果定义此类对象的数组,则第一个元素的地址必须不同于第二个元素的地址(并且 sizeof
returns 您必须添加到第一个元素的地址的字节数获取第二个的地址)。至少在某些情况下,对象的物理大小可以为 0:例如,基 class 的物理大小可以为 0(前提是它是该类型的唯一基)。
我不确定你在这里问的是什么。当你写类似 a.b
的东西时,b
会在 a
的范围内查找;如果 b
是静态成员,则 a
仅用于确定范围。当您编写 A::b
时,A::
还指定了名称查找将发生的范围。
从技术上讲,静态数据成员的声明不是定义。原因,或者至少是最初的原因,是它必须独立于 class 的任何实例在内存中布局。在早期,这是当时现有的编译器技术所要求的,即使在今天,您通常也不希望头文件中定义 class.
[=44 的初始化数据=]
我正在为 CPP 中的 static
关键字而苦恼。
经过我的实验我发现:
static
成员不在 class 里面。我计算了添加静态成员前后class的大小,发现是一样的。 我想到的一种解释是,也许 class 名称变成了名称 space(此静态成员的范围)?该成员不在 class?- 函数不在 class 内部,函数有一个隐式参数,如对象指针。然而,如果 class 中没有字段但有一堆功能,为什么 class 的大小将是一个而不是 0?但指针是否也为函数提供了一个范围,允许函数访问私有成员或函数自身具有 class 名称space.
- 我们可以同时使用 class 名称和对象来访问静态字段和函数,为什么我们可以这样做。如果 class 名称是静态函数的名称 space,为什么我们可以使用对象来访问它?对象本身是否具有 class 名称space?
- 然后我尝试在class中声明和定义一个静态成员,当然失败了,但我想知道为什么?为什么我们不能在 class 中初始化它?
XD 英语不是我的母语,请原谅我的语法错误。
static
在 C++ 中与在 C 中具有相同的语义:
- 对于变量,它定义了 "global" 个具有单个实例的变量,并且只能在有限的范围内访问。这个限定范围是:
- 编译单元,如果变量是在函数之外定义的。 请注意,可以在具有显式范围解析的整个编译单元中访问命名空间中定义的静态变量。
- 函数的范围,如果它是在函数中定义的,
- 对于函数,它限制了它们对编译单元的可见性。
在 classes 的上下文中,存在细微差别。 static 在这里意味着变量或函数独立于 class:
的对象- 对于成员变量,这意味着只有一个变量实例,由 class 的所有成员共享。 请注意,如果要将其初始化为特定值,除了在 class 中声明外,还必须在某处定义它。
- 对于成员函数,这意味着函数不能依赖非静态成员
关键字 static
在 C 中已经严重重载,C++ 增加了一个
一些额外的含义。对于 static
含义的任何真正讨论,
您需要指定上下文:在命名空间范围内,static
影响什么
called linkage:被声明的名称是否指代中的同一个实体
不同的来源,或仅在这一个特定来源中。在其他地方,对于数据,
它指定实体的生命周期,不是实体名称的绑定
实体:静态成员变量只有一个实例,它存在
独立于包含它的 class 的任何实例。如果是会员
函数是静态的,这意味着它没有 this
指向特定的指针
实例,并且可以在没有任何实例的情况下被调用。
关于您的具体问题:
静态成员 不是 class 的任何实例的一部分,因此它不会影响 [=49] 的大小=](实际上是其实例的大小)。静态成员在范围和访问控制方面仍然是成员,但它具有静态生命周期,并且存在于 class.
的任何实例之外
具体对象的
sizeof
不能为零,因为即使它不包含任何数据,它也不能与内存中的任何其他对象具有相同的地址;如果定义此类对象的数组,则第一个元素的地址必须不同于第二个元素的地址(并且sizeof
returns 您必须添加到第一个元素的地址的字节数获取第二个的地址)。至少在某些情况下,对象的物理大小可以为 0:例如,基 class 的物理大小可以为 0(前提是它是该类型的唯一基)。我不确定你在这里问的是什么。当你写类似
a.b
的东西时,b
会在a
的范围内查找;如果b
是静态成员,则a
仅用于确定范围。当您编写A::b
时,A::
还指定了名称查找将发生的范围。从技术上讲,静态数据成员的声明不是定义。原因,或者至少是最初的原因,是它必须独立于 class 的任何实例在内存中布局。在早期,这是当时现有的编译器技术所要求的,即使在今天,您通常也不希望头文件中定义 class.
[=44 的初始化数据=]