在函数声明中使用“this”(作为默认参数)

时间:2015-01-06 21:09:20

标签: c++

我可以在函数声明(类的一部分)中使用this来指定默认参数吗?

示例:

class Object {

    Object::Object(){
        this->color = rand(); //let's pretend that rand() will generate a random integer and that fillBg can draw a color given an integer.
    }

    Object::fillBg(int color = this->color){
        //do stuff
    }

}

...所以当一个对象由这个Object类构成时,随机颜色将被绘制为对象的背景(除非你传递另一种颜色)。

3 个答案:

答案 0 :(得分:7)

不,你不能。该标准明确禁止它:

  

关键字this不得用于成员函数的默认参数。

(C ++ 11,[dcl.fct.default] / 7)

我相信这条规则是有道理的,因为默认参数的初始化发生在调用者的上下文中,而不是被调用者。 (在调用者的上下文中可能没有this这样的东西,或者它可能是一个不同的对象,这可能会引起混淆。)

一种可能的解决方案就是过载。

Object::fillBg(int color) {
    // ...
}

Object::fillBg() {
    fillBg(this->color);
}

答案 1 :(得分:6)

我认为课堂上也有变色,否则一切都没有意义。

答案是否定的,这是不可能的。但你可以使用

Object::fillBg()
{
    fillBg(this->color);
}
Object::fillBg(int color)
{
    //use color
}

答案 2 :(得分:2)

不,这是不允许的。 [dcl.fct.default] / P8

  

关键字this不得用于成员函数的默认参数。 [例如:

 class A {
     void f(A* p = this) { } // error
 };
     

- 结束示例]

无论如何,由于[dcl.fct.default] / p9所说的内容无关紧要:

  

类似地,非静态成员不应在默认参数中使用,即使它不是   除非它显示为类成员访问表达式(5.2.5)的 id-expression ,或者除非它用于形成指向成员的指针(5.3.1),否则进行求值。 [示例:以下示例中的X::mem1()声明格式错误,因为没有为用作初始值设定项的非静态成员X::a提供对象。

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

然而,X::mem2()的声明是有意义的,因为访问静态成员X::b不需要任何对象。