为什么不能在类体中分配变量?

时间:2017-03-24 06:07:33

标签: c++ initialization variable-assignment

我不确定我是否已经很好地表达了这个问题,因为我是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;
        }


};

在编译时返回错误,即:

error: C2059: syntax error: '='

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

5 个答案:

答案 0 :(得分:2)

您对初始化和分配感到困惑,他们完全不同。是的,在班级成员声明中不允许分配声明,但对于第一种情况,它是initialization;

  

通过默认成员初始值设定项,它只是成员声明中包含的大括号或等于初始化程序

答案 1 :(得分:2)

  

为什么在以下代码中,可以像这样分配变量xyz

int xyz = 0;
     

但如果写得像这样

int xyz;
xyz = 0;
     

在编译时返回错误

那是因为int xyz = 0不是"分配",它""初始化"。在类体中允许初始化,而不是赋值。

答案 2 :(得分:2)

xyz = 0是一个赋值表达式。有许多上下文中的表达式可以出现在C ++中,但是当涉及到生成可执行代码的普通表达式时,它们只能出现在 initializers 语句中。语句基本上是C ++语言中可执行代码的主要示例。在C ++语言中,可执行代码(即语句)应该写​​在函数内部。这就是语言的运作方式。

所以,在你的情况下,以某种方式的唯一方式"植物"您在函数外部的表达式是在初始值设定项中使用它。例如,你可以做这样的事情

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

但是这个伎俩很丑陋,不明智,并且没有我知道的有意义的应用程序。

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

第一个

  

int xyz = 0

对C ++ 11标准有效。

但是在第二种情况下,禁止在类原型中使用 xyz = any value ,因为编译器希望只知道变量的数据类型而不是其值。通常,类原型应该是蓝图,不能用于变量赋值和操作。