C++ 静态与 C 中的静态相同吗? [复制]

Posted

技术标签:

【中文标题】C++ 静态与 C 中的静态相同吗? [复制]【英文标题】:Is C++ static same as static in C? [duplicate] 【发布时间】:2015-02-28 23:22:21 【问题描述】:

我正在为 CPP 中的 static 关键字苦苦挣扎。

经过我的实验,我发现:

    static 成员不在班级内。我在添加静态成员之前和之后计算了类的大小,发现它们是相同的。 我想到的一种解释是,也许类名变成了命名空间(这个静态成员的范围)?那个成员不在课堂上? 函数不在类内部,有一个像对象指针一样的隐式参数。但是,如果类中没有字段但有一堆函数,为什么类的大小会是 1 而不是 0?但是指针是否也为函数提供了一个范围,允许函数访问私有成员或其自身具有类命名空间的函数。 我们可以同时使用类名和对象来访问静态字段和函数,为什么我们可以这样做。如果类名是静态函数的命名空间,为什么我们可以使用对象来访问它?对象本身是否具有类命名空间? 然后我尝试在类中声明和定义一个静态成员,当然它失败了,但我想知道为什么?为什么我们不能在课堂上初始化它?

XD 英语不是我的母语,请原谅我的语法错误XD。

【问题讨论】:

AFAIK 静态类成员不需要使用类实例,并且出于明显的原因不传递this 指针。 您能否发布示例代码来说明您的预期与您所看到的?然后我们可以解释这种行为。 static在C中有两种含义,在C++中是一样的。 C++ 增加了另一个 C 中根本没有的含义。 我怀疑问题是你实际上没有在源文件中定义你的static 变量,只是在头文件(或源文件)中声明了它。需要对其进行定义,以便编译器“知道”它的去向。 [与在头文件中声明extern 变量或函数类似,您需要在源文件中的某处进行定义,以便为编译器提供实际的东西] @immibis C++ 增加了两个附加含义,一个用于成员函数,另一个用于成员数据。海报显然是在谈论 C++,因为他问的是班级成员。他应该去掉 C 标签。 【参考方案1】:

关键字static在C中已经严重重载,C++添加了一个 几个额外的含义。对于任何关于static 含义的真正讨论, 您需要指定上下文:在命名空间范围内,static 会影响 称为链接:被声明的名称是否引用同一实体 不同的来源,或仅在这一特定来源中。在其他地方,对于数据, 它指定实体的生命周期,不是实体名称的绑定 实体:静态成员变量只有一个实例,存在 独立于包含它的类的任何实例。如果是会员 函数是静态的,这意味着它没有指向特定的 this 指针 实例,并且可以在没有任何实例的情况下调用。

关于您的具体问题:

    静态成员不是类的任何实例的一部分,因此它不会影响类的大小(实际上是其实例的大小)。静态成员在范围和访问控制方面仍然是成员,但它具有静态生命周期,并且存在于类的任何实例之外。

    具体对象的sizeof不能为零,因为即使它不包含数据,它也不能与内存中的任何其他对象具有相同的地址;如果定义此类对象的数组,则第一个元素的地址必须与第二个元素的地址不同(sizeof 返回必须添加到第一个元素的地址的字节数才能获得第二)。至少在某些情况下,对象的物理大小可以为 0:例如,基类的物理大小可以为 0(前提是它是该类型的唯一基类)。

    我不确定您在这里实际问的是什么。当你写a.b之类的东西时,b会在a的范围内查找;如果b 是静态成员,则a 仅用于确定范围。当您编写A::b 时,A:: 还指定将发生名称查找的范围。

    从技术上讲,静态数据成员的声明不是定义。原因,或者至少是最初的原因,是它必须独立于类的任何实例在内存中布局。在早期,这是当时现有的编译器技术所要求的,即使在今天,您通常也不希望定义类的头文件中的初始化数据。

【讨论】:

【参考方案2】:

c++ 中的static 与 C 中的语义相同:

对于变量,它定义了具有单个实例的“全局”变量,并且只能在有限的范围内访问。这个有限的范围是: 如果变量定义在函数之外,则编译单元。 请注意,命名空间中定义的静态变量可以通过显式范围解析在整个编译单元中访问。 函数的作用域(如果在函数中定义), 对于函数,它限制了它们对编译单元的可见性。

在类的上下文中,有一个小的区别。静态在这里表示变量或函数独立于类的对象:

对于成员变量,这意味着只有一个变量实例,由类的所有成员共享。 注意,如果你想将它初始化为一个特定的值,除了在类中声明它之外,它还必须在某个地方定义。 对于成员函数,这意味着函数不能依赖非静态成员

【讨论】:

nitpick:静态变量也可以是函数的本地变量 你忘了提到静态在类范围内的含义 @self 是的!解释有点简短,尤其是对于静态成员函数。我已经编辑详细说明了

以上是关于C++ 静态与 C 中的静态相同吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

c++ 类包含一个与自身类型相同的静态成员。为啥是这种模式?

C++11中的局部静态变量初始化线程安全吗? [复制]

在 C++ 文件流中复制静态变量

C++ 中的静态数组与动态数组

总结C++与C#中的static静态修饰符

c++ std::thread 与静态成员挂起