这有效:

class MyClass
{
    int a;

    public MyClass()
    {
        int b = a;
    }
}

但这会产生编译器错误(“使用未分配的局部变量'a'”):

class MyClass
{
    public MyClass()
    {
        int a;
        int b = a;
    }
}

据我所知,发生这种情况是因为在第一个示例中,从技术上讲,编译器不知道“a”未分配。在后一个示例中,“a”是本地定义的,因此很容易跟踪。

但为什么后一个例子不起作用呢?

整数不是默认为0吗?这是编译器强制执行的“最佳实践”吗?还是还有其他原因?

有帮助吗?

解决方案

在第一个示例中,它是 场地. 。字段自动默认为 0/false/null。在第二个示例中,它是 多变的. 。变量是 不是 默认的,并且在使用它们之前必须有“明确的分配”。

本质上,当创建一个对象(或初始化一个结构)时,它会将内存归零(或者在非默认结构体的情况下,强制您手动初始化所​​有内容)。然而,变量是如此常见(在每种方法中),以至于它不希望始终将堆栈归零的开销。相反,它会强制您指定初始值。

其他提示

  

不要将整数默认为0吗?

当它们是类的数据成员时,它们会这样做,但是当它们是局部变量时它们不会这样做:局部变量需要在使用之前显式初始化,因此编译器错误。

当您实例化类的新实例时,对象所需的所有内存都是“归零”的。 int设置为0字符串设置为null等。这是为了避免C(++)中可能存在的许多奇怪的内存错误和黑客攻击。不幸的是,这也有一个很小的处理成本,所以当你创建一个局部变量时,语言假定你将很快自己设置值,并且不会将它归零以减少所需指令的总数。为了抵消使用未设置内存的风险,这会引入编译器检查以确保在允许您使用变量之前设置了值。

这可能是因为在类级别声明的变量不能在同一范围内赋值(除了声明时)

e.g

class Test
{
   int a;

   a = 0; // this is not allowed at class level & hence a initialized to default
}

,而

class Test
{
   void test()
   {
     int a;
     int b = a;

     a = 20; // this is allowed
   }
}

据我所知,当我们在类中声明一个变量并创建一个对象时,默认构造函数会初始化变量,因此不需要初始化类变量。但是来到类中的方法没有构造函数或任何东西来初始化这些变量,所以我们不能在方法中分配未初始化的变量。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top