3

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

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

我试图快速谷歌寻找答案,但我无法找到一个好的答案。

编辑:这是一个例子。

这是合法的:

 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

4 回答 4

5

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

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

于 2009-12-04T16:51:23.227 回答
1

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

于 2009-12-04T16:45:38.070 回答
0

在我的脑海中,允许来自您正在调用的类实例的默认参数,将需要在进行调用之前“取消引用”成员值,因为函数参数在this指针之前被推入堆栈。

其次,使用默认值调用该方法的每次调用都会产生少量开销,效果如下:

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

这些都是相当模糊的反驳论点,我看不出有什么理由不能这样做。

于 2009-12-04T16:45:07.747 回答
0

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

于 2009-12-04T16:46:13.980 回答