为什么编译器不将内存分配给类内声明的变量
Why does compiler not allocate memory to the variable declared inside class?
当我们在C/C++中的class
或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;
};
通常,您在类内声明成员变量正是因为您希望它是该类类型的对象的一部分。这就是语言功能的作用:允许您拥有许多不同的对象,每个对象都有自己的状态,独立于任何其他对象。
在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)
}
使用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;
- 在疯狂的部分中声明变量
- 如何在C++中为高分辨率时钟声明变量?
- 在命名空间中声明变量,在 main 中定义它,使其对所有其他文件可见
- CUDA 的性能取决于声明变量
- 如何在不为其声明变量的情况下获取和使用常量值的地址?
- C++声明变量时自动类型推断而不初始化
- 在不同循环中多次声明变量的优点
- 奇怪的错误 C2131 与 constexpr 声明变量
- 是否可以在 "if" 语句中声明变量?
- 在python-ctypes中声明变量并传递给dll函数
- 在递归函数C++中声明变量
- 只有一个定义/声明时标头声明变量的多堆定义错误
- 奇怪的未声明变量编译器错误
- 我在C++程序中声明变量时遇到问题
- 在命名空间中声明变量
- C++ lambda 按值捕获,而无需更早声明变量
- 声明变量以保存字符串列表时的内存分配
- 如何声明C 变量应突变
- 为什么允许在开关语句中声明变量?但不是声明 初始化
- 在同一命名空间中声明变量和函数是否出错?[C++]