我正在学习计算机工程,我的第二学期刚刚开始。我已经在一段时间内制作了Android应用程序。
我的编程讲师(教C ++(面向对象))说我们不能在类中初始化变量,除非我们使用构造函数,因为在创建对象之前没有专用于这些数据成员的内存类。
他说这是不正确的:
class example
{
int a = 0;
};
但我的经历说了别的话:
我在我的Android项目中创建了一个保持常量的类。我不会制作该课程的任何对象。我已经初始化了变量并且从未使用过构造函数。但它运作正常:
public class Constants {
public static final int a = 1;
}
我想知道在没有专用于该变量的内存及其工作原理时如何初始化变量。
我的故事的哪一部分是错的?我想知道当代码没有专用于我的变量(常量)的时候我的代码是如何工作的?
答案 0 :(得分:4)
class A {
int a = 0;
};
课堂初始化程序在 C ++ 11 中变得合法;因此,从你所说的中得出的唯一结论就是你的老师过去了。
但是,如果他正在教授 C ++ 03 ,而不是该语言的后期修订版,那么他的形象不正确是正确的。 < / p>
重要的是要注意他所说的关于(非静态)数据成员的内容以及他们在实际创建此类对象之前的存储空间仍然适用。
一个类内初始化程序将在构造期间初始化数据成员,只要 data-member 未在使用的构造函数中初始化&#39 ; s mem-initializer (然后后者优先)。
struct A {
A () = default;
A (int x) : m (x) { }
int m = 0; // ^ mem-initializer
};
A x; // `x.m` is initialized to `0`
A y (123); // `y.m` is initialized to `123`
答案 1 :(得分:1)
他说这是不正确的:
class example { int a = 0; }
嗯,是的,这是不正确的,在}
之后最后需要一个分号。
用分号,这是合法的C ++ 11; = 0
是一个非静态数据成员初始化程序(简称NSDMI)。它是在构造函数中执行等效初始化的合成糖。
public class Constants { public static final int a = 1; }
static
事物是每个类,并且即使没有创建该类的任何对象也存在。非静态事物是每个对象。