【问题标题】:Why is it not possible to assign a variable in the class body?为什么不能在类主体中分配变量?
【发布时间】:2017-08-16 23:31:30
【问题描述】:

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

【问题讨论】:

  • 你想要理由吗?
  • 方法是可以执行语句的一段代码。在类内部的方法之外,您可以拥有的只是带有/不带有初始化的声明。 xyz=0 是一个声明而不是声明/初始化,因此是不允许的。
  • 如果我错了,请纠正我(我几乎可以肯定是这样),但在我看来,'int xyz = 0' 都声明 xyz 是一个整数并将其值设置为零,而'xyz = 0' 只做后者。

标签: c++ initialization variable-assignment


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您对初始化和赋值感到困惑,它们是完全不同的东西。是的,类成员声明中不允许赋值语句,但对于第一种情况,它是initialization;

    通过一个默认的成员初始化器,它只是一个包含在成员声明中的大括号或等号初始化器

    【讨论】:

      【解决方案3】:

      为什么,在下面的代码中,变量xyz可以这样赋值

      int xyz = 0;
      

      但如果这样写

      int xyz;
      xyz = 0;
      

      在编译时返回错误

      那是因为int xyz = 0 不是“赋值”,而是“初始化”。类体中允许初始化,但不允许赋值。

      【讨论】:

        【解决方案4】:

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

        因此,在您的情况下,以某种方式将表达式“植入”到函数之外的唯一方法是在 initializer 中使用它。例如你可以做这样的事情

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

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

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

        【讨论】:

        • 那么在声明 xyz 后的方法中使用语句 'xyz=0' 与初始化时写入 'int xyz = 0' 有什么不同吗?在这两种情况下,如果我打印 xyz 值,我都会得到 0。
        • @James Machin: 类定义中的int xyz = 0 生成隐式初始化代码,该代码成为类构造函数的一部分。它总是在构造函数的最开始执行。如果您在某些成员函数中使用“手动”赋值 xyz = 0;,那么它只会在您调用该函数时以及如果/当​​执行到达 xyz = 0; 语句时发生。
        【解决方案5】:

        第一个

        int xyz = 0

        适用于 C++11 标准。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-09-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-28
          • 1970-01-01
          • 2018-02-05
          • 2014-11-12
          相关资源
          最近更新 更多