为什么编译器不为内部声明的变量分配内存?

时间:2012-11-16 16:34:17

标签: c++ c

当我们在C / C ++中的classstruct中声明一些变量时,我们必须创建一个classstruct的对象来为变量分配内存。

为什么我们不能在没有任何对象的情况下访问这些变量?

4 个答案:

答案 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;

您需要了解的事项:

  1. 您需要使用范围运算符(::)来访问静态成员。
  2. 静态成员的定义必须在类之外完成。上述语句int A::variable = 5;是静态成员的定义。
  3. A类型的所有对象(包含的继承对象)共享一个静态成员。 [1]
  4. [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;