我可以在函数声明(类的一部分)中使用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
类构成时,随机颜色将被绘制为对象的背景(除非你传递另一种颜色)。
答案 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
不需要任何对象。