静态 int 和 int 在 C++ 类中的区别

The difference between static int and just int in a class in C++

本文关键字:int 区别 C++ 静态      更新时间:2023-10-16

可能的重复:
静态int a和int a有什么区别?

我试图用简单的英语得到一个简单的解释。 我试图阅读和研究static int和只是int之间的区别,但无论我读到什么,似乎都让我更加困惑。 假设我在下面有一个这样的课程

class B{
static int i;
int i;
...
}

用简单的英语来说,两者有什么区别?想象一下,你正在向一个非程序员解释。 有人在这里问了类似的问题,但我并不满意。

这里有一个比喻给你。

假设一个拥有银行账户的组织。就C++而言,该组织是您的class.想象一下,该组织有代表(工作人员,如果你愿意的话)。就C++而言,它们是该类的实例(或变量)。

现在,每个代表都可以拥有自己的银行账户,只有他自己才能使用。没有其他人可以使用它。那将是一个正常的int.

但是,每个工作人员也可以使用组织的银行帐户,该帐户由他们所有人共享,并且不属于他们中的任何一个。那是你的static int.


现在,再次回到技术术语,以防您需要它。我会尽量清晰简洁。

  • 正常int

    类类型的每个变量都有自己的个人变量。所以在你的例子中,如果你做 10 个类型B的变量,每个变量里面都有自己的int i变量

  • static int

    静态变量由类的所有变量共享。静态变量不属于任何类变量,它属于类本身。因此,如果您要创建 10 个类型B的变量,每个变量都将能够访问static int i,但他们都无法拥有它(它是共享的)。

类中的静态意味着对象的所有实例B a,b,c,d;具有完全相同的成员ia.i++;更改b.ic.i等的内容。

静态在类内部和类外部的区别在于使静态变量仅对类可见或通过类可见。当然,变量不是存储在类中,而是存储在其他地方。此语法仅允许将变量的范围定义为此特定类。

当然,非静态成员对于每个实例都是唯一的。

如果你声明了 B 的多个对象,那么每个对象都有自己的 int i 副本。 但是,所有对象只有一个静态 int i。

B::i //This will refer to the static i
//As you can see this is accessed through the class name
B obj, obj2;
obj.i //This will refer to the obj member i 
obj2.i // and will be different from this which is obj2 member i

为了避免混淆重复名称,请想象以下内容:

class foo
{
public:
int i;
static int j;
};

static int j;定义了与类foo关联的单个变量,称为j。无论您创建多少个foo类型的对象,都只有一个j。在这种情况下,类foo之外的任何内容都可以使用语法foo::j访问j

i的定义形成对比, 是类型foo对象的成员。 为每个类型为foo的对象创建了一个唯一的i。 例如。

foo myObject;
foo myOtherObject;

myObject.i = 42; myOtherObject.i = 180;