代码之家  ›  专栏  ›  技术社区  ›  BlueTrin

不允许C++中的变量默认值是非静态方法或类成员的原因是什么?

  •  3
  • BlueTrin  · 技术社区  · 16 年前

    我想知道为什么类的方法的变量的默认值不能是非静态方法或同一类的成员。

    有什么原因吗?编译器不能为该方法提供非静态默认值在类中的位置吗?

    我试着用谷歌快速搜索答案,但却找不到一个好答案。

    编辑:这里是一个例子。

    这是合法的:

     class ClassTemp
    {
      static int s_member;
    
      int MagicOperation(int defaultValue = s_member)
      {
        return defaultValue;
      }
    };
    

    但这不是:

    class ClassTemp
    {
      int m_member;
    
      int MagicOperation(int defaultValue = m_member)
      {
        return defaultValue;
      }
    };
    
    4 回复  |  直到 16 年前
        1
  •  5
  •   AnT stands with Russia    16 年前

    默认参数是在调用方的上下文(这就是为什么它们通常被称为“参数”,而不是“参数”)中计算的,而不是在类方法的上下文中。这意味着为了计算这些非静态参数,编译器需要知道从中获取这些默认值的特定类实例。

    当然,理论上可以允许使用非静态成员作为默认参数,并使编译器使用在成员调用中指定的类实例。但这听起来不像是“C++方式”对我做的事情。此外,在一些更复杂的情况下,例如,当方法是虚拟的时,它可能会导致相当复杂和不雅的规范。

        2
  •  1
  •   Naveen    16 年前

    非静态成员绑定到对象,需要“this”指针才能访问该对象。由于此指针不可用于默认值,因此不允许使用

        3
  •  0
  •   Matt Joiner    16 年前

    在我的头上,允许调用的类实例中的默认参数,将需要在调用前“取消”成员值,因为函数参数在 this 指针。

    其次,对该方法的每次调用都会有一个很小的开销,使用默认值会产生以下影响:

    push provided arguments...
    push (this->member)
    push this
    

    这些都是相当含糊的反驳,我也不明白为什么不能这样做。

        4
  •  0
  •   Paul    16 年前

    如果我理解您的问题,那是因为编译器知道您正在初始化这个方法变量的非静态变量是否存在——因此要求它是静态的,所以当方法变量初始化时,它保证存在。这不是要查的。

    推荐文章