c ++默认参数

时间:2011-04-11 18:23:06

标签: c++

  

可能重复:
  Nonstatic member as a default argument of a nonstatic member function

确定。所以我在理解如何完成看似简单的任务时遇到了问题......这就是我想要完成的事情:

#include <iostream>

using namespace std;

class A{
private:
    int _x;
public:
    A(int x){
        _x = x;
    }

    void test(int x=_x){
        cout << x << endl;
    }
};

int main(){
    A a(3);
    a.test();
}

编译器抱怨int x=_x部分说error: invalid use of non-static data member A::_x

那么如何使用这样的默认参数?

感谢。

3 个答案:

答案 0 :(得分:13)

你做不到。

但是test的重载可能没有参数。

void test(){
    test(_x);
}

答案 1 :(得分:3)

你做不到。但是,如果将_x声明为静态数据成员:

static int _x; //_x is static data member now!

然后你可以这样做,即你可以使用_x作为你的成员函数中参数的默认值。

C ++标准本身的一个很好的例子。引自第8.3.6 / 9节:

  

同样,非静态成员也应如此   不能在默认参数中使用   表达,即使不是   评估,除非它看起来像   类成员访问的id-expression   表达式(5.2.5)或除非   用于形成指向成员的指针   (5.3.1)。 [例子:宣言   以下示例中的X :: mem1()是   形象不对,因为没有对象   提供给非静态成员X :: a   用作初始化器。

int b;
class X {
   int a;
   int mem1(int i = a); // error: nonstatic member a used as default argument
   int mem2(int i = b); // OK; use X::b
   static int b;
};
  

X :: mem2()的声明是   但是,因为没有任何对象,   需要访问静态成员   X :: B

希望它有所帮助。

答案 2 :(得分:0)

你的功能是否有一个哨兵(-1)?

void test(int x=-1)
{
    if(x == -1)
        x = _x;

    //Rest of code
}

你也可以使用:

void test(int x, bool bUseLocal=false)
{
    if(bUseLocal)
        x = _x;

    //Rest of code
}