为什么无法在 class 主体中分配变量?

Why is it not possible to assign a variable in the class body?

我不确定我是否很好地表达了这个问题,因为我是 c++ 的新手,但我想知道为什么在下面的代码中,变量 xyz 可以这样分配

class Fraction {
    public:
        int num, denom;
        int xyz = 0;

        // Constructors
        Fraction() {
            num = 0;
            denom = 1;
        }

        Fraction(int n, int d) {
            num = n;
            denom = d;
        }


};

但是如果这样写

class Fraction {
    public:
        int num, denom;
        int xyz;
        xyz = 0;

        // Constructors
        Fraction() {
            num = 0;
            denom = 1;
        }

        Fraction(int n, int d) {
            num = n;
            denom = d;
        }


};

returns 编译错误,即:

error: C2059: syntax error: '='

error: C2238: unexpected token(s) preceding ';'

因为class只是一个蓝图,类似于一个宣言。但是,您可以使用构造函数进行初始化。

您混淆了初始化和赋值,它们是完全不同的东西。是的,class 成员声明中不允许使用赋值语句,但对于第一种情况,它是 initialization;

Through a default member initializer, which is simply a brace or equals initializer included in the member declaration

why, in the following code, can the variable xyz be assigned like this

int xyz = 0;

but if written like this

int xyz;
xyz = 0;

returns errors on compilation

那是因为 int xyz = 0 不是 "assignment",而是 "initialization"。 class 主体中允许初始化,而赋值则不允许。

xyz = 0 是一个赋值表达式。在 C++ 中表达式可以出现在许多上下文中,但是对于生成可执行代码的普通表达式,它们只能出现在 initializersstatements.语句基本上是C++语言中可执行代码的主要例子。在 C++ 语言中,可执行代码(即语句)应该写​​在函数内部。这就是语言的工作原理。

因此,在您的情况下,以某种方式 "plant" 您的表达式在函数之外的唯一方法是在 初始化程序 中使用它。例如你可以这样做

struct S
{
    int a;
    int b = (a = 42);
};

但是这个技巧很丑陋,不明智,而且据我所知没有任何有意义的应用。

您的第一个语法是初始化语法。 = 符号不是赋值运算符,而只是初始化语法的句法元素。即使在这种情况下,实际的初始化代码最终也会成为 constructor 代码的一部分。因此,即使是该代码最终也会成为函数的一部分。

第一个

int xyz = 0

适用于 C++11 标准。

但在第二种情况下,在 class 原型中使用 xyz = 任何值 是被禁止的,因为编译器只希望知道变量的数据类型而不是它的值.同样,一般来说,class 原型应该是一个蓝图,不能用于变量赋值和操作。