当我们在C / C ++中的class
或struct
中声明一些变量时,我们必须创建一个class
或struct
的对象来为变量分配内存。
为什么我们不能在没有任何对象的情况下访问这些变量?
答案 0 :(得分:5)
嗯,答案是真的:因为这是这种语言特征的重点。 类的数据成员的想法是它是类对象的组成部分。它与整个阶级对象一起开始它的生命,它结束了它的生活。
如果您有两个类对象,则您有两组完全独立的数据成员。如果您有50个类对象,则您有50个完全独立的数据成员集。如果您没有类对象,则没有要访问的数据成员集。换句话说,如果没有类对象,则无法访问这些“变量”,因为它们在没有类对象的情况下不存在。
当您在类定义中声明类的数据成员时,您并不是真正“声明变量”。类定义只是描述了类类型的布局。它本身不产生物理,即注意到它会存在于数据存储器中,注意到你可以物理访问。
同时,C ++语言具有类的 static 成员这样的概念。类的静态数据成员不与特定的类对象相关联。它们独立存在。事实上,静态数据成员只是普通的全局变量,由相当薄的C ++层覆盖 - 特定的“语法糖”(更复杂的命名,访问控制等)。类的静态数据成员可以作为普通变量访问,没有任何对象
换句话说,这不是“为什么?”的问题。而是一个你需要什么的问题。如果需要非静态数据成员功能,请使用非静态数据成员。如果你想要静态数据成员功能......好吧,你明白了。
答案 1 :(得分:4)
一个类只是一个'布局',用于指定实例化对象的构造,销毁方式以及它们的行为方式。对于建筑物的成像比较:一个类是用于建造房屋的计划。对象就是房子本身。
如果您想要没有对象的变量,请使用全局变量。您可以将它们放在命名空间中:
namespace test
{
int answer = 42; // Initialization is optional
}
// ...
void f()
{
// Use it like this:
test::answer = 0;
}
您也可以使用静态成员:
class MyClass
{
public:
static int value;
};
答案 2 :(得分:1)
通常,您在类中声明一个成员变量,因为您希望它成为该类类型的对象的一部分。这就是该语言特性的用途:允许您拥有许多不同的对象,每个对象都有自己独立于任何其他对象的状态。
在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)
}
答案 3 :(得分:1)
使用static关键字:
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;