C++ 为什么不允许使用C++;变量的默认值是非静态方法还是类的成员?

C++ 为什么不允许使用C++;变量的默认值是非静态方法还是类的成员?,c++,static,theory,default-value,C++,Static,Theory,Default Value,我想知道为什么类的方法的变量的默认值不能是非静态方法或同一类的成员 这有什么原因吗?编译器不能向方法提供非静态默认值在类中的位置吗 我试着用谷歌快速搜索答案,但没能找到一个好答案 编辑:下面是一个示例。 这是合法的: class ClassTemp { static int s_member; int MagicOperation(int defaultValue = s_member) { return defaultValue; } }; 但这不是: class

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

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

我试着用谷歌快速搜索答案,但没能找到一个好答案

编辑:下面是一个示例。

这是合法的:

 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;
  }
};

在我看来,如果允许调用类实例中的默认参数,则在进行调用之前需要“取消引用”成员值,因为函数参数在
这个
指针之前被推到堆栈上

其次,使用默认值对该方法的每次调用都会有一小部分开销,其效果是:

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

这些都是非常模糊的反参数,我也看不出为什么不能这样做。

非静态成员绑定到一个对象,需要“this”指针才能访问它。由于此指针不适用于默认值,因此如果我理解您的问题,则不允许使用此指针,因为编译器确实知道您正在初始化此方法变量的非静态变量是否存在,因此要求它是静态的,以便在初始化方法变量时保证它存在。这不是查找的问题。

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


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

你能提供你的意思的示例代码吗?您的意思是想用某个成员函数的结果初始化类成员值吗?是的,请澄清。如果“默认值”是指字段初始化器,那么它们就不存在,例如C++中的所有字段,即<代码> Pube:int x=123;<代码>已经是一个错误。如果您指的是构造函数中的初始值设定项列表,那么它可以在那里调用成员函数,即
struct foo{int bar;int baz();foo():bar(baz()){}
——尽管一些编译器对此给出了警告。为什么它不可用?它将在稍后可用,以便无论如何调用该方法,对吗?该方法代码由类中的所有实例共享。所以,如果一个类有多个实例,那么应该选择哪个值?用t9从手机应答。在前面的评论中读我:-)是的,但是this指针必须在某个时候传递,即使代码是共享的,方法代码仍然可以访问成员,所以this指针必须对方法可用,不是吗?我想你和AndreyT回答了这个问题!