[英]Use “this” in a function declaration (as a default parameter)
我可以使用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
類組成時,隨機顏色將被繪制為該對象的背景(除非您傳遞其他顏色)。
不,你不能。 該標准明確禁止它:
關鍵字
this
不能在成員函數的默認參數中使用。
(C ++ 11,[dcl.fct.default] / 7)
我相信該規則是有道理的,因為默認參數的初始化發生在調用方而不是被調用方的上下文中。 (在調用者的上下文中,可能沒有this
,或者可能是另一個對象,這可能引起混亂。)
一種可能的解決方案就是過載。
Object::fillBg(int color) {
// ...
}
Object::fillBg() {
fillBg(this->color);
}
我假設類中也有可變的顏色,否則一切都沒有意義。
答案是否定的,這是不可能的。 但是你可以使用
Object::fillBg()
{
fillBg(this->color);
}
Object::fillBg(int color)
{
//use color
}
不,這是不允許的。 [dcl.fct.default] / p8
關鍵字this不能在成員函數的默認參數中使用。 [示例:
class A { void f(A* p = this) { } // error };
—結束示例]
無論如何,由於[dcl.fct.default] / p9所說的沒關系:
同樣,非靜態成員也不得在默認參數中使用,即使未進行評估,除非它顯示為類成員訪問表達式(5.2.5)的id表達式 ,或者除非它用於形成指向成員(5.3.1)的指針。 [示例:在以下示例中,
X::mem1()
的聲明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
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.