7

我试图将长度的当前值作为默认参数作为函数参数传递。但编译器显示错误

“'this' 不能在这种情况下使用”

谁能告诉我我犯了什么错误。?

class A
{

    private:
    int length;
    public:
    A();
    void display(int l=this->length)
    {
        cout<<"the length is "<<l<<endl;
    }

};


int main()
{

    A a;
    a.display();    
    return 0;

}
4

3 回答 3

17

您的成员函数:

void display(int l=this->length)

在概念上等价于:

void display(A * this, int l=this->length); //translated by the compiler

这意味着,您在表达式中使用了一个参数,该参数是 C++ 中不允许的其他参数的默认参数,如 §8.3.6/9 (C++03) 所述,

每次调用函数时都会评估默认参数。函数参数的求值顺序未指定因此,函数的参数不应在默认参数表达式中使用,即使它们没有被评估。

请注意,C++ 不允许这样做:

int f(int a, int b = a); //illegal : §8.3.6/9

解决方案是添加一个不带参数的重载:

void display()
{
    display(length); //call the other one!
}

如果您不想再添加一个函数,请为参数选择一个不可能的默认值。例如,由于它描述的长度永远不会是负数,那么您可以选择-1作为默认值,并且您可以将您的函数实现为:

void display(int l = -1)
{
      if ( l <= -1 ) 
           l = length; //use it as default value!
      //start using l 
}
于 2012-06-23T05:18:07.067 回答
3

您可以改为用户重载和转发。

class A
{
    private:
    int length;
    public:
    A();

    void display()
    {
        display(this->length);
    }

    void display(int l)
    {
        cout<<"the length is "<<l<<endl;
    }
};
于 2012-06-23T05:20:05.973 回答
1

在编译时,没有对象,所以没有 this。

如果成员函数可以访问属性本身,为什么要将对象的属性之一作为默认值传递给成员函数?

于 2012-06-23T05:18:08.530 回答