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 中的静态相同吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章