class
当我们在 C/C++ 内部或在 C/C++ 中声明某个变量时struct
,我们必须为该变量创建一个对象class
或struct
为该变量分配内存。
为什么我们不能在没有任何对象的情况下访问这些变量?
嗯,答案是真的:因为这就是这个语言特性的全部意义所在。类的数据成员的想法是让它成为类对象的一个组成部分。它与整个类对象一起开始它的生命,它与整个类对象一起结束它的生命。
如果你有两个类对象,你就有两组完全独立的数据成员。如果您有 50 个类对象,那么您就有 50 个完全独立的数据成员集。如果您有零类对象,则您没有要访问的数据成员集。换句话说,没有类对象就不能访问这些“变量”,因为没有类对象它们就不存在。
当您在类定义中声明类的数据成员时,您并没有真正“声明变量”。类定义简单地描述了类类型的布局。就其本身而言,它不会产生任何物理内容,即指出它将存在于数据内存中,并指出您可以物理访问。
同时,C++语言有类的静态成员这样的概念。类的静态数据成员不与特定的类对象相关联。它们独立存在。事实上,静态数据成员只是普通的全局变量,被一层相当薄的 C++ 特定的“语法糖”(更精细的命名、访问控制等)覆盖。类的静态数据成员可以作为普通变量访问,无需任何目的。
换句话说,这不是一个“为什么”的问题。而是你需要什么的问题。如果您想要非静态数据成员功能,请使用非静态数据成员。如果你想要静态数据成员功能......好吧,你明白了。
类只是一个“布局”,用于指定实例对象将如何构造、销毁以及它们的行为方式。对于与建筑物的图像比较:类是用于建造房屋的计划。对象是房子本身。
如果您想要没有对象的变量,请使用全局变量。您可以将它们放在命名空间中:
namespace test
{
int answer = 42; // Initialization is optional
}
// ...
void f()
{
// Use it like this:
test::answer = 0;
}
您还可以使用静态成员:
class MyClass
{
public:
static int value;
};
使用静态关键字:
class A {
public:
static int varaible;
};
int A::variable = 5;
然后,您可以随时访问没有对象的变量。如下。
A::varaible = 25;
你需要知道的事情:
int A::variable = 5;
是一个静态成员的定义。A
(包括继承的对象)共享一个静态成员。[1][1]
A a;
A b;
a::variable == b::variable == 25;
//if we change a::variable
a::variable = 26;
//b::variable has the same value.
b::variable == a::variable == 26;
通常,您在类中声明一个成员变量正是因为您希望它成为该类类型对象的一部分。这就是该语言功能的用途:允许您拥有许多不同的对象,每个对象都有自己的状态,独立于任何其他对象。
在 C++(但不是 C)中,static
如果您想要一个独立于任何对象的变量,则可以声明它。这将具有静态存储持续时间,就像在类外部声明的变量一样。在 C 中,如果你想要这样的东西,全局变量是唯一的选择。
例如:
struct thing {
int a; // part of a "thing" object
static int b; // not part of a "thing"
};
// Static variables need a definition, in exactly one source file
int thing::b;
int main() {
thing::b = 1; // OK: no object needed
thing::a = 2; // ERROR: object needed
thing t1;
t1.a = 3; // OK: accessing object member
t1.b = 4; // OK: equivalent to "thing::b"
thing t2;
t2.a = 5; // OK: accessing object member
t2.b = 6; // OK: equivalent to "thing::b"
std::cout << t1.a; // prints 3
std::cout << t2.a; // prints 5 - independent of t1.a
std::cout << t1.b; // prints 6
std::cout << t2.b; // prints 6 - same variable as t1.b (aka thing::b)
}